如何让C ++预编译器做一个“循环”

时间:2012-12-03 04:22:25

标签: c++ precompile

我想简化以下代码:

switch (index)
    {
    case 1:
        output = function1();
        break;
    case 2:
        output = function2();
        break;
    case 3:
        output = function3();
        break;
    ....

其中index是编译时常量。

如果我要使用预编译器宏,我需要使用它n次,其中n是个案数。如何将上述代码减少为O(1)行代码?

3 个答案:

答案 0 :(得分:3)

试试这个(假设函数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建议的那样生成开关。另一种选择是使用函数指针数组

答案 1 :(得分:3)

你不能用宏来做 - 但这会起作用(我认为):

int (*functions[])() = { &function1, &function2, &function3};

int output = functions[index]();

答案 2 :(得分:1)

可能是supermacro可以略微简化你的工作。 只需使用代码

创建“counter.def”文件
COUNTER(1)
COUNTER(2)
COUNTER(3)
#undef COUNTER

然后在任何情况下使用开关或任何其他结构重复计数

switch(index)
{
    #define COUNTER(i) case i: output = function##i(); break;
    #include "counter.def"
}