如果我尝试使用std.algm.ill(Range1,Range2)(Range1 Range,Range2 Fill),我总是收到找不到模板匹配的错误消息。看起来编译器正在尝试与Fill(范围、值)匹配,而不是另一个。
auto test = new char[256];
fill(test, "abc".dup);
不能使用Fill填充字符数组吗?
错误
Test.d(13):错误:模板 Std.algm.ill(Range,Value)if (isForwardRange!(范围)&;&; Is(typeof(range.front=填充)执行 与任何函数模板都不匹配 申报 Test.d(13):错误: 模板 Std.algm.ill(Range,Value)if (isForwardRange!(范围)&;&; Is(typeof(range.front=填充) 无法从推导出嵌入函数 参数类型!()(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
始终保证是有效字符。然而,char
和wchar
本身根本不能保证是有效字符,如果您看到使用了单独的char
或wchar
,这通常是一个错误。多个chars
或wchars
通常必须组合成一个字符。因此,您不能单独处理chars
或wchars
。这就是为什么如果要使用Foreach迭代任何类型的字符串,始终应将其类型指定为dchar
。
foreach(dchar c; str)
...
如果您没有指定dchar
,那么它将是str
的任何字符类型,这将不可避免地导致错误,除非str
是dchar
的数组,因为您最终得到的是代码单元(字符片段)而不是代码点(整个字符)。只能单独处理dchars
。
dchar
的范围,而不管它们的实际元素类型是什么。因此,当您在一个字符串上调用popFront
时,它可能会弹出多个char
或wchar
。如果调用front
,它可能必须对多个chars
或wchars
进行解码才能返回字符串中的第一个字符dchar
。这意味着您不能将char
或wchar
数组视为随机访问。第4个字符可以是第4个元素,也可以是第12个。不管它从哪个索引开始,它都可能是多个代码单元长的,所以您不能只在char
或wchar
数组中抓取一个随机索引并期望它是有效的。因此,char
和wchar
数组是而不是随机访问范围。它们也不是输出范围。
想一想。让我们以'U00010143'
()为例。UTF-8的码元长度为4,UTF-16的码元长度为2。您不能只用它填充任何随机的
char
或wchar
数组。如果它是char
数组,并且其长度不是4的倍数,那么最后一个()将不适合。如果它是
wchar
数组,并且它的长度不是2的倍数,那么它也会有同样的问题。因此,在char
或wchar
数组上使用fill
这样的函数确实不起作用。
dchar
数组一起工作。由于UTF-32代码单元保证是代码点,数组中的每个字符都是一个元素,它既可以是随机访问范围,也可以是输出范围。因此,如果要将fill
这样的函数与字符数组一起使用,则需要使用dchar
的数组。您可以使用std.conv.to
将其转换为之后需要的字符数组类型,但不能直接填充char
或wchar
的数组。
char
和wchar
数组适用于不需要输出范围或随机访问范围的算法,但它们不适用于这些算法。对于这些,您需要dchar
数组。
相关推荐
最新文章