Отображение Enums в шаблонных специализациях
У меня есть шаблонный класс, который использует глобальное перечисление с некоторыми режимами, которые мне нужны в качестве параметров для функций-членов этого класса. Я хочу написать специализацию этого класса, которая требует, чтобы значения этого перечисления были "переведены". В настоящее время я реализую функцию преобразования, которая в основном является оператором switch, который переводит общие значения перечисления в значения, требуемые специализацией. Например, что-то вроде этого:
enum Modes { ModeA, ModeB, ModeC };
template<typename Foo>
class tClass
{
void bar ( Modes _mode )
{
do_stuff(_mode);
}
}
template<>
class tClass<specializedFoo>
{
void bar ( Modes _mode )
{
do_Stuff(convertMode(_mode));
}
}
Члены-функции вызываются часто, что вводит дополнительный вызов функции каждый раз, когда используется экземпляр специализации, чего, на мой взгляд, следует избегать, поскольку я уже знаю точный тип этого параметра шаблона.
Есть ли способ избежать функции перевода и, следовательно, дополнительного вызова функции?
1 ответ
После нескольких дополнительных исследований я нашел возможное решение:
Если мои функции-члены получают целочисленное значение в качестве параметра вместо значения из Modes и внутри специализации класса, я использую отдельное перечисление с переведенными значениями в том же порядке, что и в исходном перечислении, я могу использовать:
enum specEnum {ModeASpec, ModeBSpec, ModeCSpec};
void bar ( int _mode )
{
do_Stuff( static_cast<specEnum>(_mode));
}
Редактировать / Дополнение:
Нет даже необходимости менять тип на int для параметров, поэтому
void bar ( Modes _mode )
{
do_Stuff( static_cast<specEnum>(_mode));
}
делает трюк.