C++ 如何制作C++;预编译器执行一个";“循环”;
我想简化以下代码:C++ 如何制作C++;预编译器执行一个";“循环”;,c++,precompile,C++,Precompile,我想简化以下代码: switch (index) { case 1: output = function1(); break; case 2: output = function2(); break; case 3: output = function3(); break; .... 其中,索引是编译时常量 如果我要使用预编译器宏,我需要使用它n次,其中n是案
switch (index)
{
case 1:
output = function1();
break;
case 2:
output = function2();
break;
case 3:
output = function3();
break;
....
其中,索引
是编译时常量
如果我要使用预编译器宏,我需要使用它
n
次,其中n
是案例数。如何将上述代码减少到O(1)行?可能是超级宏,可以稍微简化您的工作。
只需使用以下代码创建“counter.def”文件:
COUNTER(1)
COUNTER(2)
COUNTER(3)
#undef COUNTER
然后在任何情况下使用开关或任何其他结构重复计数
switch(index)
{
#define COUNTER(i) case i: output = function##i(); break;
#include "counter.def"
}
试着这样做(假设函数1-n是实名,正如您所说,索引是一个编译时常量):
校正:这对变量不起作用,如果直接使用常数,则会起作用。如果提供的代码是每个case语句中的全部代码,那么这可能无法达到目的
根本不需要进行切换。或者,您可以使用模板专门化
template<int index> function();
output = function<index>();
模板函数();
输出=函数();
并为每个索引专门化函数模板
template<> function<1>(){return 1;} // or {return function1();}
template function(){return 1;}//或{return function 1();}
如果它不是编译时常量,则需要像Fomin Arseniy建议的那样生成开关。另一种选择是使用函数指针数组,你不能用宏来实现,但这会起作用(我认为):
非常感谢。一个问题是我无法更改function1,…,functionn的定义。这不是问题,第一个方法将按原样工作,第二个方法可以是function1 functionn的包装器。这会导致编译器错误:“functionindex”没有依赖于模板参数的参数,因此“functionindex”的声明必须可用[-fppermissive]你说得对,宏方法只有在索引被替换为数字本身的情况下才会起作用。很抱歉没有捕捉到它。为什么这样做会降低代码的可读性?@EdHeal我希望有一些预编译程序魔法可以使代码更可读。类似于output=some_MAGICAL_macro(函数,索引)@MartinDrozdik:使用宏不太像C++语言。请选择Ed Heal的答案。我首先建议检查代码。(“Jinak se dápřEdávat pointer/reference na funkci I jako parametr.Býváto mnohem lepší。”)马丁谢谢你的建议。实际上我是按照Ed的回答来做的。有时你没有选择,但要使用宏。比如当你使用不是C++的ISH库时,“哦,我明白了,我没有选择。”——哦,不……请不要在C++中这样做。
template<> function<1>(){return 1;} // or {return function1();}
int (*functions[])() = { &function1, &function2, &function3};
int output = functions[index]();