问题描述
enum operation {
plus,delete
//...
}
operation_do(plus);
在该函数内部,有一个模板函数调用,该调用基于运行时参数。
重要说明:我无法将operation_do()
用作模板函数。这就是条件。
void operation_do(operation op) {
call<op>();
}
我遇到了编译错误:op
不是常量表达式。
constexpr operation get(operation arg) {
return arg;
}
void operation_do(operation op) {
constexpr operation elem = get(op);
call<elem >();
}
但是仍然是相同的错误:op
不是常数表达式。
有人可以帮忙吗?
解决方法
在该函数内部,有一个模板函数调用,该调用基于实时参数。重要提示:我不能将operation_do()用作模板函数。这就是条件。
这是问题所在。
在C ++中,运行时值(因此,函数参数可以是运行时值)不能用作模板参数。
出于相同的原因,无法通过constexpr
值进行遍历
void operation_do(operation op) {
constexpr operation elem = get(op); // <--- error
call<elem >();
}
因为无法从运行时值初始化elem
。
我能想象的最好的方法是使用一系列if
(或者可能更好的是switch
)来将其从运行时值传递到编译时值。
类似
void operation_do (operation op)
{
switch ( op )
{
case plus:
call<plus>();
break;
case del:
case<del>()
break;
}
}
显然,只有在枚举值的数量受到限制并且您可以将switch
集中在一个位置的情况下,这才是可接受的。
请注意,delete
是关键字,因此不能将其用作标识符。