c ++ 11 — 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …