Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何制作C++;预编译器执行一个";“循环”;_C++_Precompile - Fatal编程技术网

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]();