我知道在C ++ 11中引入了新的字符类型。但是,由于C ++ 11并非在任何地方都可用,因此可能需要为希望使用UTF-16和UTF-32的每个人引入char16_t
和char32_t
。我试图实现这样的类型。这是使用g ++和clang ++编译的工作实现的基本变体。为简单起见,我对uint8_t
使用typedef,但它也适用于其他类型。
template <typename CLASS>
class basechar
{
private:
CLASS self;
public:
~basechar()
{}
basechar()
: self(0) {}
basechar(const CLASS& object)
: self(object) {}
inline operator CLASS() const
{ return self; }
friend std::ostream&
operator<<(std::ostream& sstream, const basechar<CLASS>& object)
{ sstream << (uint32_t)(uint8_t)(object.self); return sstream; }
};
int main()
{
typedef basechar<uint8_t> bchar;
const char* array = "AZbyCX";
const bchar* barray = reinterpret_cast<const bchar*>(array);
for (size_t i = 0; i < 4; ++i)
{
std::cout << (uint32_t)(uint8_t)array[i] << std::endl;
std::cout << barray[i] << std::endl;
}
return 0;
}
它完全打印出我期望的内容:
65
65
90
90
98
98
121
121
由于它可能没有明确定义的行为,我想问:是否有可能在不同的编译器上实现这样的功能?我希望能够重载uint16_t
和mychar16_t
类型的函数。
非常感谢!