看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
yoco315:你的限制是「能呼叫的」嗎?是的話這個 callable traits 05/22 01:34
yoco315:看看是不是符合你的需求… 05/22 01:34
suhorng:謝謝yoco大, 搜尋時有看到這篇, 測試後他確實可以偵測是不 05/22 09:27
suhorng:是有operator(), 不過我還不知道怎麼偵測函數 05/22 09:29
suhorng:我試試看 Prowl 的解法! 05/22 09:31
loveme00835:Andy Prowl的解一直都蠻漂亮的 xD 05/22 09:56