【问题标题】:Is there a way, or need to write a generic, templated character literal有没有办法,或者需要编写一个通用的模板字符文字
【发布时间】:2020-01-10 19:25:58
【问题描述】:

考虑以下示例:

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 字符超出了问题的上下文。

【问题讨论】:

  • 如果你发现一个系统使用 (in-?) 著名的 EBCDIC 编码 (ASCII/unicode '-' == 0x2d, EBCDIC '-' == 0x60)... 通用方式?假设您需要专门针对普通 char 和 wchar_t (C++20),之前,我认为 u8'-' 和 '-' 不能被解析为同一类型...

标签: c++ character-encoding char literals widechar


【解决方案1】:

无前缀字符根据执行字符集进行编码。 L-前缀字符是根据执行宽字符集编码的。其他的根据 ISO 10640 代码点进行编码。 (参见标准中的 [lex.com] 或讨论字符文字的 cppreference。)

如果执行字符集以与 ISO 10640 相同的方式对减号字符进行编码,那你很好,但如果它们不同,这将不起作用。由于大多数(如果不是全部)系统都使用 ASCII 作为执行字符集,所以没问题。

从 C++20 开始,您可以为每种字符类型专门化 is_minus,并为每种字符提供正确的前缀字符,因为每种前缀形式都有不同的类型。 (这在 C++20 之前最有可能,除了 u8 前缀字符的类型为 char,与无前缀字符相同。在 C++20 中,u8 前缀字符的类型为 char8_t。)

【讨论】:

  • 不幸的是,必须专门化整个功能是非常不令人满意的。我想此时非 ASCII 支持是不值得的。
猜你喜欢
  • 2015-03-11
  • 2012-06-08
  • 2013-10-11
  • 2012-04-28
  • 1970-01-01
  • 2019-09-30
  • 2021-03-29
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多