如何使C++预编译器执行"loop"
How to make the C++ precompiler do a "loop"
我想简化以下代码:
switch (index)
{
case 1:
output = function1();
break;
case 2:
output = function2();
break;
case 3:
output = function3();
break;
....
其中index
是编译时常量。
如果我使用预编译器宏,则需要使用它n
次,其中n
是事例数。如何将上述代码简化为 O(1) 行代码?
试试这个(假设函数 1-n 是真实名称。 正如你所说,该索引是一个编译时常量):
#define CALLFUNCTION(x) function##x()
output = CALLFUNCTION(1);
更正:这不适用于变量,如果直接使用常量,这将起作用。如果提供的代码是每个 case 语句中的全部内容,这可能会破坏目的。
根本不需要做开关。或者,您可以使用模板专用化。
template<int index> function();
output = function<index>();
并为每个索引专用化函数模板。
template<> function<1>(){return 1;} // or {return function1();}
如果它不是编译时常量,则需要像 Fomin Arseniy 建议的那样生成开关。另一种选择是使用函数指针数组
你不能用宏来做到这一点 - 但这将起作用(我认为):
int (*functions[])() = { &function1, &function2, &function3};
int output = functions[index]();
可能是超宏可以稍微简化你的工作。只需使用代码创建"counter.def"文件:
COUNTER(1)
COUNTER(2)
COUNTER(3)
#undef COUNTER
然后在任何情况下使用开关或任何其他具有重复计数的结构
switch(index)
{
#define COUNTER(i) case i: output = function##i(); break;
#include "counter.def"
}
派对迟到了,从那时起,检查它的提升库很有用:
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#define DECL(z, n, _) case n: (function ## n)(); break;
BOOST_PP_REPEAT_FROM_TO(1, 3, DECL, _)
但是,如果您使用的是较新的C++,建议改用模板元编程和if constexpr ()
。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 如何使C++预编译器执行"loop"