Привет!
Есть 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 — подглядеть как у них сделано, и взять их базовую реализацию, так же и для других компилеров.
Или есть ещё варианты?