簡體   English   中英

在函數名稱中使用變量值

[英]Using variable values in function names

我有一系列基於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);
}
...

問題是存在大量這些可能性,程序的這一部分對時間非常敏感。 我可以使用基於變量的i, j, t的自定義值使用任何東西來調用函數E_i_j_t(args)嗎? 我已經研究過預處理程序語句,但是有點迷茫。

#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);
}

##是一個運算符,僅在替換了宏的參數后才填充左右“值”。

這樣的宏可能會有所幫助:

#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);

但是總的來說,具有這樣的功能是一個糟糕的設計。

如果您是c ++程序員,則可以考慮使用none-type模板參數。 我想您正在使用它作為版本控制的一些方法; 在這種情況下,將所需版本定義為consexpr id並將其用作默認模板值可能會派上用場。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM