如果我尝试使用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的倍数,那么它将有同样的问题.因此,使用像filla char或wchararray 这样的函数真的不行.
现在,它可以很好地使用dchar数组.由于UTF-32代码单元保证是代码点,因此数组中的每个字符dchar都是一个元素,它既可以是随机访问范围,也可以是输出范围.因此,如果要使用fill与字符数组类似的函数,则需要使用数组dchar.您可以使用std.conv.to它将其转换为之后所需的字符数组类型,但无法填充数组char或wchar直接填充数组.
算法的数组char和wchar工作很好,不需要输出范围或随机访问范围,但它们不适用于那些.对于那些,你需要数组dchar.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |