在模板专门化中映射枚举

Mapping Enums in template specializations

本文关键字:映射 枚举 专门化      更新时间:2023-10-16

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

memberfunctions被频繁调用,这会在每次使用特殊化声明时引入额外的函数调用,在我看来,这是可以避免的,因为我已经知道该模板参数的确切类型。

有没有什么方法可以避免翻译函数,从而避免额外的函数调用?

经过更多的研究,我找到了一个可能的解决方案:

如果我的成员函数获得一个整数值作为参数,而不是来自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));
}

真的很管用。