有没有办法,或者需要写一个通用的模板化字符文字

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.)