c++ - 有没有办法,或者需要写一个通用的模板化字 rune 字

标签 c++ character-encoding char literals widechar

考虑以下示例:

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/

相关文章:

c++ - SDL2 和 OpenGL 模板缓冲区不起作用

java - 在 Java 中将半带和全带 CJK 拉丁字符转换为 ASCII

python - MATLAB打开带有savemat写的汉字的.mat文件时报错

postgresql - 在 PostgreSQL 中转换重音字符?

c++ - 如何在 C/C++ 中将 int 添加到 char[]

c++ - 渲染时加载纹理 (OpenGL)

c++ - C++ 中 <type*[n]> 和 <type(*)[n]> 的区别

C. 带字符的 for 循环

c# - C# 中的 char (C++) 操作

c++ - 如果当前页面(站点)在受信任的站点区域中,是否可以从 ActiveX 代码中检查?