在模板特化中映射枚举

时间:2013-11-22 12:51:27

标签: c++ templates enums template-specialization

我有一个模板化的类,它使用一个全局枚举,我需要一些模式作为该类的成员函数的参数。我想写一个该类的特化,它要求枚举的值被“翻译”。目前我实现了一个转换函数,它基本上是一个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 个答案:

答案 0 :(得分:1)

经过一番研究后,我发现了一个可能的解决方案:

如果我的成员函数获取一个整数值作为参数而不是模式中的值,并且在类专门化中我使用单独的枚举,其翻译的值与原始枚举中的顺序相同,我可以使用:

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));
}

诀窍。