我有一系列基于3个整数不同定义的函数。我想在函数名中使用变量值。这可以使用if-else语句来实现:
if (i == 0 and j == 0 and t == 0) {
return E_0_0_0(args);
}
else if (i == 1 and j == 0 and t == 0) {
return E_1_0_0(args);
}
...
问题在于存在大量这些可能性,并且该部分程序对时间非常敏感。我可以使用任何内容根据变量使用E_i_j_t(args)
的自定义值来调用函数i, j, t
吗?我查看过预处理器语句但有点丢失。
答案 0 :(得分:0)
#define CALL(x,y,v) f##x##y(v)
void f00(int v) { printf("00\n"); }
void f10(int v) { printf("10\n"); }
void f14(int v) { printf("14\n"); }
int main() {
CALL(0,0,0);
CALL(1,0,0);
CALL(1,4,0);
}
##
是一个操作员,它只是连接它的左右和#34;值"在替换了宏的参数之后。
答案 1 :(得分:0)
像这样的宏可能有所帮助:
#define if_match_invoke_E(_i, _j, _t) \
if (i == _i && j == _j && t == _t) { \
E_ ## _i ## _ ## _j ## _ ## _t(args); \
}
然后:
if_match_invoke_E(0, 0, 0)
else if_match_invoke_E(1, 0, 0)
函数指针数组也可能有效:
void (*)(args_t) E[] = { E_0_0_0, E_1_0_0 };
E[i](args);
一般来说,拥有这样的功能是一种糟糕的设计。
答案 2 :(得分:0)
如果您是c ++程序员,那么您可以考虑使用非类型模板参数。我猜你使用它作为版本控制的一些方法;在这种情况下,将所需版本定义为consexpr id并将其用作默认模板值可能会派上用场。