看板 C_and_CPP 關於我們 聯絡資訊
有點鑽牛角的問題,不過也是實際遇到的問題。 這裡 template 用途主要是拿來取代 C 裡之 function pointer, 問題整理後之示意 code 如下 typedef int (*ptr1)(int, int); int add1(int a, int b){return a+b;} template<typename T, typename Func> T Execute(Func ptr) { return ptr(1,1); /* 等一下要問這裡 */ } 執行時變 cout << Execute<int, ptr1>(add1) << endl; 今天我要多加一份 adder typedef double (*ptr2)(double, double, double); double add2(double a, double b, double c){return a+b+c;} 而在呼叫時,我希望直接可以仿前面的方式 cout << Execute<double, ptr2>(add2) << endl; 但這樣 Execute 裡就不能寫 return ptr(1,1), 而是要寫 return ptr(1.0, 1.0, 1.0)。 類似這情形況,不知目前是否有什麼方法可處理掉? 目前想到的可能是必須去解 template function 裡之 prototype < 不會解 >, 解出來後若 prototype 複雜,應也是一項大工程 < 一堆 if-else >。 抑或,以這種情形而言,根本就不適合用 template ? 用到幾個 function 就人工逐一展開? 先謝謝各位不吝指導先。 -- 我知道 ~ 但別說出來 , 說出來讓人感到特別難過... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.165.40
shadow0326:感覺上Execute作的事其實就是boost::bind的部分功能 03/13 22:34
iamstudent:可能要用function object,因為自己寫這個很困難 03/13 22:56
iamstudent:template如果要自己寫,應該會用到TypeList的觀念 03/13 22:57
iamstudent:可以參考一下 C++設計新思維 CH2, 3, 6 03/13 22:58
iamstudent:抱歉更正一下,沒CH6,應該是CH5,我記錯了 03/13 22:59
s3748679:痾... 類似這樣搞不知道行不行:http://ideone.com/hFi8p 03/13 23:01
s3748679:那個.. 沒考慮很多~ 單純寫寫而已~ 03/13 23:02
tropical72:@shadow: boost 完全沒碰過,不過您提了我會去補起來. 03/13 23:05
tropical72:@iamstudent:我也在想用func.obj.不過用func.obj.的話 03/13 23:05
tropical72:似乎有點像在C中直接傳struct,最後用va_arg去拆(POD). 03/13 23:07
tropical72:@s3748679: 謝謝您的sample code,它也可讓我研究一陣. 03/13 23:07
s3748679:嗯嗯~ 加油~~~ (溜^^" 03/13 23:21
legnaleurc:std::bind 已經是 C++11 標準元件 03/14 00:09
loveme00835:http://codepad.org/aw9Ihl0q 03/14 04:50
tropical72:!! love 大的 code 很感興趣,不過vc下是不是要多裝什? 03/14 06:31
iamstudent:love大的那個code怎麼弄的,template能不定個數了! 03/14 09:23
hilorrk:compiler開C++0x(C++11)就可以了 03/14 09:58
iamstudent:知道有支援這東西後,type list就沒有意義了 03/14 10:36
iamstudent:不知道目前市面上有沒有c++11的書 03/14 10:37
Chikei:補充,如果沒辦法開C++11的,可以看看支不支援TR1 03/14 10:51
Chikei:支援的話,這東西在<tr1/functional> 03/14 10:51
tropical72:所以,VC 可能要裝 feture package 了吧 .. 03/14 17:03