如果我尝试使用std.algorithm.fill(Range1,Range2)(Range1范围,Range2填充),我会不断收到错误消息,表明找不到模板匹配.看起来编译器试图匹配fill(Range,Value)而不是另一个.
auto test = new char[256];
fill(test, "abc".dup);
Run Code Online (Sandbox Code Playgroud)
是否无法使用填充填充字符数组?
错误
test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))与任何函数模板声明都不匹配
test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))不能从参数类型推导出emplate函数!( )(炭[],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
始终保证a 是有效字符.char
而wchar
自己,但是,不保证有效字符在所有,如果你看到一个人很普遍的错误char
或wchar
使用.多个chars
或wchars
经常必须组合以构成单个字符.所以,你无法处理chars
或wchars
单独处理.这就是为什么如果你用foreach迭代任何类型的字符串,你应该总是给它的类型dchar
.
foreach(dchar c; str)
...
Run Code Online (Sandbox Code Playgroud)
如果你没有指定dchar
,那么它将是什么字符类型,str
除非str
是一个数组,否则总是会导致错误dchar
,因为你最终会得到代码单元(字符片段)而不是代码点(整个字符) ).只能dchars
单独处理.
正是因为所有这些,所有字符串类型和字符数组都被认为是范围dchar
,而不管它们的实际元素类型是什么.所以,当你调用popFront
一个字符串时,它可能会弹出不仅仅是一个char
或更多wchar
.如果你打电话front
,它可能必须解码多个chars
或wchars
返回dchar
该字符串中的第一个字符.这意味着,你不能这样对待char
或wchar
阵列为随机访问.第四个字符可能是第四个元素,也可能是第12个元素.无论它从哪个索引开始,它可能是多个代码单元长,所以你不能只是抓取一个随机索引char
或wchar
数组,并期望它是有效的.因此,数组char
和wchar
是不是随机访问范围.它们也不是输出范围.
想一想.我们以character '\U00010143'
() for instance. It has a code unit length of 4 for UTF-8 and 2 for UTF-16. You can't just fill any random
char
或wchar
数组.如果它是一个char
数组,并且它的长度不是4的倍数,则last() isn't going to fit. If it's a
wchar
数组,并且它的长度不是2的倍数,那么它将有同样的问题.因此,使用像fill
a char
或wchar
array 这样的函数真的不行.
现在,它可以很好地使用dchar
数组.由于UTF-32代码单元保证是代码点,因此数组中的每个字符dchar
都是一个元素,它既可以是随机访问范围,也可以是输出范围.因此,如果要使用fill
与字符数组类似的函数,则需要使用数组dchar
.您可以使用std.conv.to
它将其转换为之后所需的字符数组类型,但无法填充数组char
或wchar
直接填充数组.
算法的数组char
和wchar
工作很好,不需要输出范围或随机访问范围,但它们不适用于那些.对于那些,你需要数组dchar
.
归档时间: |
|
查看次数: |
328 次 |
最近记录: |