完全模拟缺少的不同内置类型(特别是:char16_t和char32_t)

时间:2012-01-05 18:36:25

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

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;

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

1 个答案:

答案 0 :(得分: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("...");
}

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