首页 > 解决方案 > 根据运行时值取模板

问题描述

我有一个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不是一个常量表达式。有人可以帮忙吗?

标签: c++templatesconstexprconstant-expression

解决方案


在该函数内部,有一个基于实时参数的模板函数调用。重要提示:我不能将 operation_do() 作为模板函数。这是条件。

这就是问题。

在 C++ 中,运行时值(因此是函数参数,可以是运行时值)不能用作模板参数。

出于同样的原因,无法通过constexpr

void operation_do(operation op) {
    constexpr operation elem = get(op); // <--- error
    call<elem >();
}

因为elem无法从运行时值初始化。

我能想象的最好的事情是使用一系列if(或者,也许更好的是 a switch)从运行时值传递到编译时值。

某事作为

void operation_do (operation op)
 {
   switch ( op )
    { 
      case plus:
         call<plus>();
         break;

      case del:
         case<del>()
         break;
    }
 }

显然,只有当枚举值的数量有限并且您可以将其集中switch在一个地方时,这才是可以接受的。

请注意,这delete是一个关键字,因此您不能将其用作标识符。


推荐阅读