gpt4 book ai didi

d - 为什么 std.algorithm.fill 不接受字符数组?

转载 作者:行者123 更新时间:2023-12-04 12:26:26 24 4
gpt4 key购买 nike

如果我尝试使用 std.algorithm.fill(Range1, Range2)(Range1 range, Range2 Filler),我会不断收到找不到模板匹配的错误消息。看起来编译器正在尝试匹配填充(范围,值)而不是另一个。

auto test = new char[256];
fill(test, "abc".dup);
不能使用填充来填充字符数组吗?
错误

test.d(13): Error: templatestd.algorithm.fill(Range,Value) if(isForwardRange!(Range) &&is(typeof(range.front = filler))) doesnot match any function templatedeclaration

test.d(13): Error:templatestd.algorithm.fill(Range,Value) if(isForwardRange!(Range) &&is(typeof(range.front = filler)))cannot deduce t emplate function fromargument types !()(char[],char[])

最佳答案

std.algorithm.fill需要一个范围。所有字符串类型的范围都是 dchar .这是因为它们都是 unicode。 char是 UTF-8 编码单元 wchar是 UTF-16 编码单元,dchar是一个 UTF-32 编码单元。多个代码单元组成一个代码点,即一个字符。对于 UTF-8,一个代码点最多可以有 6 个代码单元。对于 UTF-16,它最多可以是 2。对于 UTF-32,1 个代码单元始终是 1 个代码点,所以 dchar总是保证是一个有效的字符。 charwchar但是,它们本身根本不能保证是有效字符,如果您看到单个 char,这通常是一个错误。或 wchar用过的。多个 charswchars通常必须组合成一个字符。所以,你不能处理 charswchars分别。这就是为什么如果你使用 foreach 迭代任何类型的字符串,你应该始终将其类型指定为 dchar。 .

foreach(dchar c; str)
...

如果您没有指定 dchar , 那么它将是 str 的任何字符类型是,这总是会导致错误,除非 strdchar 的数组, 因为你最终会得到代码单元(字符)而不是代码点(整个字符)。仅限 dchars可以单独处理。

正因为如此,所有的字符串类型和字符数组都被认为是 dchar 的范围。 ,不管它们的实际元素类型是什么。所以,当您调用 popFront在一个字符串上,它可能会弹出更多的内容,而不仅仅是一个 charwchar .如果您调用 front ,它可能需要解码多个 charswchars返回 dchar这是字符串中的第一个字符。这意味着你不能对待 charwchar数组作为随机访问。第 4 个字符可以是第 4 个元素,也可以是第 12 个。而且无论它从哪个索引开始,它都可能是多个代码单元,因此您不能只在 char 中获取随机索引或 wchar数组并期望它是有效的。所以, char 的数组和 wchar不是随机访问范围。它们也不是输出范围。

想想看。让我们以字符 '\U00010143'为例( 𐅃 )例如。 UTF-8 的代码单元长度为 4,UTF-16 的代码单元长度为 2。你不能随便填 charwchar阵列与它。如果是 char数组,并且它的长度不是 4 的倍数,那么最后一个 ( 𐅃) 将不适合。如果是 wchar数组,并且它的长度不是2的倍数,那么它会有同样的问题。所以,使用像 fill 这样的函数确实是行不通的。在 charwchar大批。

现在,它可以与 dchar 一起正常工作。大批。因为 UTF-32 代码单元保证是一个代码点,所以 dchar 中的每个字符数组是一个元素,既可以是随机访问范围,也可以是输出范围。所以,如果你想使用像 fill 这样的函数对于字符数组,您需要使用 dchar 的数组.您可以使用 std.conv.to之后将其转换为所需的字符数组类型,但不能填充 char 的数组或 wchar直接地。
char 的数组和 wchar适用于不需要输出范围或随机访问范围的算法,但它们不适用于这些。对于这些,您需要 dchar 的数组.

关于d - 为什么 std.algorithm.fill 不接受字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com