※ 引述《tropical72 (藍影)》之銘言:
: 但.是 (如果沒有但是的話下面可以不用看了...)
: 但.是. 如果好死不死,那些 func1 , func2 的 prototype 長得不一樣的話呢?
: 像是 void func1(int, int) , double func2(double, int) , ... etc ,
: 這裡其實我覺得還是直接用 45 個 switch-case 下去硬幹會比較方便,
: 走 C 風格的話還是可以用 函式指標陣列,只是所有函式必須改寫成
: void func(void *) 或是 int func( void *) ,至於 C++ 有沒有比較好的解法?
: 嗯,我想是有的,只是我也沒用過,也想知道。
當然是可以的,如果寫不出來一定是TMP用得不夠用力 (誤
https://gist.github.com/PkmX/0fa65c755c39b676d79e
(請搭配 gcc-5.1 / clang-3.6 -std=c++1z 服用)
void f1(const int x) { std::cout << "f1: " << x << std::endl; }
void f2(const double x) { std::cout << "f2: " << x << std::endl; }
index_call(0, std::make_tuple(42), f1, f2); // f1(42)
index_call(1, std::make_tuple(42), f1, f2); // f2(42)
這裡index_call的第一個參數是代表要call第幾個function,
而第二個參數是要傳給該function的參數們,用一個std::tuple包起來,
後面可以接若干個callback objects
注意到上面f1和f2的參數型態不一樣,但是還可以放在一起選擇呼叫