C ++ 11有两个新的字符整数数据类型char16_t
和char32_t
。我想为那些没有不同类型的编译器模拟它们,以便重载I / O操作,看它们是一个字符而不是它们的整数值。
这些是要求:
typedef
)。char16_t c16 = u"blabla unicode text blabla";
必须有效。我在文字部门失败的第一次尝试是一个强类型的枚举:
enum char16_t : uint16_t;
这也有其他缺点,或许可以通过自己提供必要的操作员来解决(这对我来说真的很好)。
答案 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("...");
}
显然,您仍然需要提供各种运营商,例如使整数运算和适当的转换工作。