【发布时间】:2016-10-09 10:58:12
【问题描述】:
我经常有一些基于某种设计方法生成输出的原型行为。我模板化了设计方法,它可以实现我需要的许多功能。但是,有时设计方法是在运行时给出的,所以我通常需要编写一个巨大的 switch 语句。它通常看起来像这样:
enum class Operation
{
A, B
};
template<Operation O>
void execute();
template<>
void execute<A>()
{
// ...
}
template<>
void execute<B>()
{
// ...
}
void execute(Operation o)
{
switch (o)
{
case Operation::A: return execute<Operation::A>();
case Operation::B: return execute<Operation::B>();
}
}
我很好奇是否有人为这个系统找到了一个很好的模式——这种方法的主要缺点是,如果实现了新的枚举,必须输入所有支持的枚举并在几个地方进行维护。
e:我应该补充一点,弄乱编译时模板的原因是允许编译器内联 HPC 中的方法以及继承 constexpr 属性。
e2:实际上,我想我要问的是让编译器使用隐式开关结构生成所有可能的代码路径。也许是一些递归模板魔法?
【问题讨论】:
-
使用继承和多态怎么样?
-
正如我刚刚添加的,编译器能够在编译时进行内联和优化是非常重要的(即整个代码结构是可见的和确定的)。否则是的,虚函数显然可以解决问题。
标签: c++ switch-statement metaprogramming