我正在建立一个允许我以各种编码方式获取字符串的API,包括utf8,utf16,utf32和wchar_t(根据操作系统可能是utf32或utf16)。
新的C ++标准引入了新类型char16_t
和char32_t
,它们没有这种模糊性,应该在将来使用,所以我也想支持它们,但是问题是,是否会干扰与普通uint16_t
,uint32_t
,wchar_t
类型不允许重载,因为它们可能引用相同的类型?
class some_class {
public:
void set(std::string); // utf8 string
void set(std::wstring); // wchar string utf16 or utf32 according
// to sizeof(wchar_t)
void set(std::basic_string<uint16_t>)
// wchar independent utf16 string
void set(std::basic_string<uint32_t>);
// wchar independent utf32 string
#ifdef HAVE_NEW_UNICODE_CHARRECTERS
void set(std::basic_string<char16_t>)
// new standard utf16 string
void set(std::basic_string<char32_t>);
// new standard utf32 string
#endif
};
所以我可以写:
foo.set(U"Some utf32 String");
foo.set(u"Some utf16 string");
今天有std::basic_string<char16_t>
和std::basic_string<char32_t>
的typedef:
typedef basic_string<wchar_t> wstring.
我找不到任何参考。
编辑:根据gcc-4.4的标题,介绍了这些新类型:
typedef basic_string<char16_t> u16string;
typedef basic_string<char32_t> u32string;
我只是想确保这是实际的标准要求,而不是gcc-ism。
答案 0 :(得分:30)
1)char16_t
和char32_t
将是不同的新类型,因此可以对它们进行重载。
引自ISO/IEC JTC1 SC22 WG21 N2018:
将
char16_t
定义为a的typedef 不同的新类型,名称 与_Char16_t
具有相同大小和代表的uint_least16_t
。 同样,将char32_t
定义为a typedef到一个不同的新类型,有 名称_Char32_t
具有相同的名称 大小和表示为uint_least32_t
。
进一步解释(来自devx.com文章“Prepare Yourself for the Unicode Revolution”):
你可能想知道为什么 首先需要
_Char16_t
和_Char32_t
类型和关键字 当typedefuint_least16_t
和uint_least32_t
已经可用。 新类型的主要问题 解决就是超载。下雪了 可能超载的功能 采取_Char16_t
和_Char32_t
参数,并创建专业化 例如std::basic_string<_Char16_t>
与...截然不同std::basic_string <wchar_t>
。
2)u16string
和u32string
确实是C ++ 0x的一部分而不仅仅是GCC的主题,正如various standard draft papers中提到的那样。它们将包含在新的<string>
标题中。引自同一篇文章:
标准图书馆也将提供 类似于typedef
_Char16_t
的{{1}}和_Char32_t
typedef,wstring
等,适用于以下标准类:
wcout
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,