c++ - 根据运行时值取模板
问题描述
我有一个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
(或者,也许更好的是 a switch
)从运行时值传递到编译时值。
某事作为
void operation_do (operation op)
{
switch ( op )
{
case plus:
call<plus>();
break;
case del:
case<del>()
break;
}
}
显然,只有当枚举值的数量有限并且您可以将其集中switch
在一个地方时,这才是可以接受的。
请注意,这delete
是一个关键字,因此您不能将其用作标识符。
推荐阅读
- selenium - 如何使硒cookie不会过期?(Python)
- html - 有没有办法通过点击 jquery 在引导程序中创建多个模式?
- regex - 重命名文件括号前的所有内容
- python - 无法按集群对数据点进行分组
- spring - 使用 ElasticsearchRepository 和 RestHighLevelClient 参数查询的 Spring Boot
- sql - OracleSQL -> 按三个级别排序视图
- c# - Excel 所针对的 .net 版本 - TLS 问题
- python - PySerial。在串行读取期间无法进行任何输入
- javascript - 如何使用按钮更改在搜索字段中输入的文本值的颜色?
- java - 设计一个 JVM REPL