0

我想简化以下代码:

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

哪里index是编译时间常数。

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

4

3 回答 3

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

于 2012-12-03T04:44:11.757 回答
3

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

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

int output = functions[index]();
于 2012-12-03T05:14:47.147 回答
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"
}
于 2012-12-03T04:42:57.413 回答