在函数名

时间:2018-03-24 14:28:00

标签: c++ c++11

我有一系列基于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吗?我查看过预处理器语句但有点丢失。

3 个答案:

答案 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并将其用作默认模板值可能会派上用场。