У меня есть следующие методы (вообще говоря) в моем классе битового потока:
class BitStream
{
void StoreBits( unsigned int data, unsigned int numBits );
public:
template<typename T>
void WriteType( T value ) { StoreBits( value, sizeof(T) * 8 ) );
template<>
void WriteType( float value ) { StoreBits( *(unsigned int*)&value, sizeof(float) * 8 ) );
};
Кто-то бросил класс перечисления строгого типа в WriteType, и, очевидно, перечисление не преобразуется автоматически в целое число без знака.
Что я могу сделать, чтобы написать специализацию, которая обрабатывает все случаи перечисления, используя одно и то же имя функции?
Это упрощение проблемы — у меня есть экземпляры класса enum, которые выбрасываются в ряд других методов-членов BitStream, которые мне приходится обрабатывать, таких как ReadType, StreamType (чтение или запись), SmallestRangeWrite‹Min,Max›() и т. д.
У меня есть поддержка С++ 17. Я знаю, что есть std::is_enum, но как я могу специализироваться на этом здесь, особенно во время компиляции?
Можно как-нибудь написать:
template<typename T>inline void BitStream::WriteType( T value )
{
if (type_is_enum())
StoreEnum<T>(value)
else
StoreBits( value, sizeof(T) * 8 ) );
}
Мне нужно убедиться, что метод StoreBits не компилируется, когда T является перечислением. Просто избежать этого во время выполнения с веткой недостаточно.
is_enum
. Просто сделайтеtype_is_enum()
--›is_enum_v<T>
лайк этому. - person cigien   schedule 02.10.2020if constexpr
- person Dmitry Kuzminov   schedule 02.10.2020u32
? Компилятор кода делает что-то неправильно дляenum
типов? - person cigien   schedule 02.10.2020is_enum_v<T>
является псевдонимом дляis_enum<T>::value
. - person parktomatomi   schedule 02.10.2020