【问题标题】:fully emulating missing distinct builtin types (specifically: char16_t and char32_t)完全模拟缺失的不同内置类型(特别是:char16_t 和 char32_t)
【发布时间】:2012-01-05 18:36:25
【问题描述】:

C++11 有两种新的字符整数数据类型,char16_tchar32_t。我想为没有不同类型的编译器模拟它们,以便重载 I/O 操作以将它们视为字符而不是整数值。

这些是要求:

  • 不同(无typedef)。
  • 正常系统上的精确宽度(ala uint16_t 和 uint32_t)
  • 允许其他 C++11 功能(见下文第一次尝试)
  • 必须很好地处理文字; char16_t c16 = u"blabla unicode text blabla"; 必须有效。
  • 如果 char16_t 可以在数学运算符中使用,显然这也需要起作用。

我在文字部门失败的第一次尝试是强类型枚举:

enum char16_t : uint16_t;

这也有其他缺点,也许可以通过自己提供必要的运算符来解决(这对我来说真的很好)。

【问题讨论】:

  • 完全不清楚你为什么要尝试这个或者你想使用什么工具。 “第一次尝试”使用 C++11。如果没有最新的 C++11 编译器,就无法从没有保证 Unicode 支持的编译器获取 Unicode 文字,也无法在编译时操作字符串。

标签: c++ types unicode c++11 character


【解决方案1】:

我认为你不会让初始化工作,因为没有太多空间让它工作。问题是您在示例中使用的初始化不应该起作用:字符串文字 u"..." 产生一个 char16_t const 对象数组,您想用它初始化一个指针:

char16_t const* c16 = u"...";

此外,如果没有在编译器中实现 char16_t,则不太可能支持 char16_t 字符串文字。你能做到的最好的事情就是玩一些旨在做正确事情的宏观技巧。现在,你会使用例如宽字符文字,当您获得支持 char16_t 的编译器时,您只需将宏更改为使用 char16_t 文字。即使要使其正常工作,您也可能需要使用大于 16 位的记录类型,因为 wchar_t 在某些平台上使用 32 位。

#define CONCAT(a,b) a##b

#if defined(HAS_C16)
#  define C16S(s) CONCAT(u,s)
#else
#  define C16S(s) reinterpret_cast<char16_t const*>(CONCAT(L,s));
struct char16_t
{
    unsigned short value;
};
#endif


int main()
{
    char16_t const* c16 = C16S("...");
}

显然,您仍然需要提供各种运算符,例如使整数算术和适当的转换工作。

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 2013-10-04
    • 2016-03-11
    • 2015-11-10
    • 1970-01-01
    • 2021-06-25
    • 2017-12-25
    • 2020-03-25
    相关资源
    最近更新 更多