【发布时间】:2021-06-27 21:29:00
【问题描述】:
我是 C++ 和整个模板编程的新手,很抱歉这个问题可能有点愚蠢或没有多大意义,但我有以下代码
enum SomeEnum : int {FIRST, SECOND, THIRD, FOURTH};
template<SomeEnum Val>
void Foo(){
... some code ...
int x = 0;
if(Val == FIRST){
x = DoCalculationA();
}
else if(Val == THIRD){
x = DoCalculationB();
}
... some more code that uses 'x', and perhaps some more if checks on Val ...
}
我可以假设编译器会优化掉 if 语句 - 例如当我将这个函数调用为 Foo<FIRST>() 时,它不会对 Val 进行任何 if 检查?这甚至是使用模板的适当方式,还是我应该将枚举作为参数传递?我的代码需要运行得非常快,所以如果分支问题很大,那么任何额外的代码。
编辑:
只是为了让它更清楚一点。 Foo 是这样调用的
Bar(SomeOtherEnum someOtherEnum){
switch(someOtherEnum){
case VALUE_1:
Foo<FIRST>();
case VALUE_2:
Foo<SECOND>();
case VALUE_3:
Foo<THIRD>();
default:
Foo<FOURTH>();
}
}
【问题讨论】:
-
您可以用
switch..case语句替换Val的if..elseif。 stackoverflow.com/q/97987 -
嘿,那些
if声明死了吗? -
不,这个函数将被多次调用,使用所有不同的枚举值。在
foo中还有更多if 分支,具体取决于Val的值。所以我基本上想要做的是有一些Bar函数调用适当的Foo模板,具体取决于Bar函数中的一些枚举变量。基本上在Bar中会有一个主switch 语句调用正确的Foo模板。 -
使用
if constexpr? -
所以如果我在模板值上使用
if constexpr,我可以安全地假设分支将消失?我想这可能就是我想要的,谢谢!
标签: c++ templates optimization