[問題] 如何限定template可以接的型別

看板C_and_CPP (C/C++)作者 ( )時間13年前 (2013/05/22 00:34), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) G++ 4.7 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) NO 問題(Question): 為了需要, 我重載的 operator+ 我希望這個程式可以接任意 callable type (普通函數, function object 例如 std::function, lambda, ...) 不過我不知道要怎麼做這個限制, 讓不符合這個限制的不要用我這個重載函式, 而去呼叫其他內建的之類 程式碼(Code):(請善用置底文網頁, 記得排版) 嘗試: template<typename F, typename G, class = typename enable_if<is_same<typename result_of<F(int)>::type, typename result_of<G(int)>::type>::value, bool>::type> bool operator+(F a, G b) { return a(5) == b(5); } 不過若 F, G 不能被呼叫, 在 result_of 那邊會 compile error 而不是用其他內建的 重載函式 這樣甚至會讓人沒辦法正常的使用原先的 + (或 iterator 的 + 之類) 這邊只是小段的, 實際上重載的程式更有意義 這樣做只是不想要每次寫個 lambda 時都要額外再用 std::function 包起來 不然原先 operator+ 重載的型態都是 std::function 另外也嘗試過 is_function, 不過查了資料還是不會用 (而且好像只能判直接的函式型態) 希望板上前輩不吝賜教, 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.59.110


05/22 01:34, , 2F
你的限制是「能呼叫的」嗎?是的話這個 callable traits
05/22 01:34, 2F

05/22 01:34, , 3F
看看是不是符合你的需求…
05/22 01:34, 3F

05/22 09:27, , 4F
謝謝yoco大, 搜尋時有看到這篇, 測試後他確實可以偵測是不
05/22 09:27, 4F

05/22 09:29, , 5F
是有operator(), 不過我還不知道怎麼偵測函數
05/22 09:29, 5F

05/22 09:31, , 6F
我試試看 Prowl 的解法!
05/22 09:31, 6F

05/22 09:56, , 7F
Andy Prowl的解一直都蠻漂亮的 xD
05/22 09:56, 7F
文章代碼(AID): #1Hcw8pwQ (C_and_CPP)
文章代碼(AID): #1Hcw8pwQ (C_and_CPP)