考虑以下示例:
template<class CharT>
bool is_minus(CharT c) {
return c == '-';
}
//assert(is_minus('-')); // works of course
assert(is_minus(u8'-'));
assert(is_minus(u'-'));
assert(is_minus(U'-'));
assert(is_minus(L'-'));
这适用于我的系统。标准会保证这在所有系统上都能正常工作吗?考虑到函数中的字 rune 字是不同类型的。其他角色也是如此吗?
如果不能保证,有没有办法以通用方式编写文字,以便我得到 '-'、u8'-'、u'-'、U'-' 或 L 之一'-'
取决于模板中的 CharT
。
注意:在某些语言环境中可用于表示替代减号的 Unicode 字符不在问题的上下文中。
最佳答案
无前缀字符根据执行字符集进行编码。 L
前缀字符根据执行宽字符集进行编码。其他的是基于 ISO 10640 代码点编码的。 (请参阅标准中的 [lex.com] 或 cppreference,其中讨论了字 rune 字。)
如果执行字符集以与 ISO 10640 相同的方式对减号字符进行编码,那很好,但如果它们不同,这将不起作用。由于大多数(如果不是全部)系统都使用 ASCII 作为执行字符集,所以您没问题。
从 C++20 开始,您可以为每种字符类型专门化 is_minus
,并为每种字符提供正确的前缀字符,因为每种前缀形式都有不同的类型。 (这在 C++20 之前很可能,除了 u8
前缀字符是 char
类型,与无前缀字符相同。在 C++20 中 u8
前缀字符属于 char8_t
类型。)
关于c++ - 有没有办法,或者需要写一个通用的模板化字 rune 字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847049/