0

我知道在 C++11 中引入了新的字符类型。但是,由于 C++11 并非在所有地方都可用,因此可能有必要向希望使用 UTF-16 和 UTF-32 的每个人介绍char16_t和介绍。char32_t我试图实现这样的类型。这是使用 g++ 和 clang++ 编译的工作实现的基本变体。为简单起见,我将 typedef 用于uint8_t,但它也适用于其他类型。

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_tmychar16_t类型中重载。

非常感谢!

4

0 回答 0