根据运行时值获取模板

问题描述

我有一个enum

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是关键字,因此不能将其用作标识符。