Хочу странного: свой string для enum class
От: пффф  
Дата: 26.03.24 10:35
Оценка:
Привет!

Есть enum class:
enum class EMyEnum : std::uint16_t
{
    Zero   = 0,
    //...
};



Хочу делать из него строки. Изначально думал использовать просто вектор, но потом подумалось, что хочу, чтобы работало всё как со строками. Плюс ещё профит от оптимизации коротких строк.

По сути — это и есть строки, только упакованные — коды до 256 — соотв. ASCII символам, а коды больше — это идентификаторы строк в контейнере-словаре.


Хотел сначала простым
using MyEnumString = std::basic_string<EMyEnum>


Потом подумалось, что скорее всего не прокатит, и надо делать свой char_traits для EMyEnum.

Начал копать. В MSVC там так:
[ccode]
template <class _Elem>
struct char_traits : _Char_traits<_Elem, long> {}; // properties of a string or stream unknown element

template <>
struct char_traits<char16_t> : _WChar_traits<char16_t> {};

using u16streampos = streampos;

template <>
struct char_traits<char32_t> : _Char_traits<char32_t, unsigned int> {};

using u32streampos = streampos;

template <>
struct char_traits<wchar_t> : _WChar_traits<wchar_t> {};
[/ccode]


Т.е. все использует либо _Char_traits, либо _WChar_traits.
_Char_traits поуниверсальнее, как я понял, _WChar_traits скорее всего его использует.

Тут проблема — я не могу использовать _Char_traits/_WChar_traits — это же просто детали MSVC реализации. Хотя, подозреваю, у других компиляторов реализация char_traits наверняка тоже через какую-то общую базу, но имена, скорее всего другие. Ну, и у MSVC в другой версии имена могут быть другими.

Можно было бы написать целиком свою реализацию, но я глянул у MS реализацию _Char_traits. Там оно обмазано всё макросами _NODISCARD, _CONSTEXPR17, _CONSTEXPR20, _HAS_MEMCPY_MEMMOVE_INTRINSICS и тп, ну и по возможности, интринсиками.
Хочется, чтобы моя реализация была тоже максимально оптимальной, но тут придётся самому под каждый компилер писать.


Как быть?

В принципе, для MSVC можно заюзать _Char_traits, и надеяться, что в других версиях либы это не поменяется; для GCC — подглядеть как у них сделано, и взять их базовую реализацию, так же и для других компилеров.

Или есть ещё варианты?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.