微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据运行时值获取模板

如何解决根据运行时值获取模板

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。