C++: целочисленная реализация фиксированного размера для типов charX_t

Мне известно, что новые типы символов были введены в C++11. Однако, поскольку C++ 11 не везде доступен, может возникнуть необходимость char16_t а также char32_t для всех, кто хочет работать с UTF-16 и UTF-32. Я пытался реализовать такие типы. Вот базовый вариант рабочей реализации, скомпилированный с 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_t а также mychar16_t типы.

Большое спасибо!

0 ответов

Другие вопросы по тегам