我想简化以下代码:
switch (index)
{
case 1:
output = function1();
break;
case 2:
output = function2();
break;
case 3:
output = function3();
break;
....
其中index
是编译时常量。
如果我要使用预编译器宏,我需要使用它n
次,其中n
是个案数。如何将上述代码减少为O(1)行代码?
答案 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"
}