有没有办法,或者需要写一个通用的模板化字符文字
Is there a way, or need to write a generic, templated character literal
考虑以下示例:
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'-'));
这适用于我的系统。标准会保证这在所有系统上都能正常工作吗?考虑到函数中的字符文字是不同类型的。其他角色也是如此吗?
如果不能保证,有没有办法以通用方式编写文字,以便根据模板中的 CharT
获得 '-', u8'-', u'-', U'-' or L'-'
之一。
注意:在某些语言环境中可用于表示替代减号的 Unicode 字符不在问题的上下文范围内。
无前缀字符根据执行字符集进行编码。 L
-前缀字符根据执行宽字符集进行编码。其他的是基于 ISO 10640 代码点编码的。 (请参阅标准中的 [lex.com] 或讨论字符文字的 cppreference。)
如果执行字符集以与 ISO 10640 相同的方式对减号字符进行编码,那很好,但如果它们不同,这将不起作用。由于大多数(如果不是全部)系统都使用 ASCII 作为执行字符集,所以你没问题。
从 C++20 开始,您可以针对每种字符类型专门化 is_minus
,并为每种字符类型提供正确的前缀字符,因为每种前缀形式都有不同的类型。 (这在 C++20 之前很可能,除了 u8
前缀字符是 char
类型,与无前缀字符相同。在 C++20 中,u8
前缀字符是输入 char8_t
.)
考虑以下示例:
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'-'));
这适用于我的系统。标准会保证这在所有系统上都能正常工作吗?考虑到函数中的字符文字是不同类型的。其他角色也是如此吗?
如果不能保证,有没有办法以通用方式编写文字,以便根据模板中的 CharT
获得 '-', u8'-', u'-', U'-' or L'-'
之一。
注意:在某些语言环境中可用于表示替代减号的 Unicode 字符不在问题的上下文范围内。
无前缀字符根据执行字符集进行编码。 L
-前缀字符根据执行宽字符集进行编码。其他的是基于 ISO 10640 代码点编码的。 (请参阅标准中的 [lex.com] 或讨论字符文字的 cppreference。)
如果执行字符集以与 ISO 10640 相同的方式对减号字符进行编码,那很好,但如果它们不同,这将不起作用。由于大多数(如果不是全部)系统都使用 ASCII 作为执行字符集,所以你没问题。
从 C++20 开始,您可以针对每种字符类型专门化 is_minus
,并为每种字符类型提供正确的前缀字符,因为每种前缀形式都有不同的类型。 (这在 C++20 之前很可能,除了 u8
前缀字符是 char
类型,与无前缀字符相同。在 C++20 中,u8
前缀字符是输入 char8_t
.)