看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《walm20 (New CygnusX)》之銘言: : 程式碼如下: (C++ primer 3rd 中文版 侯捷譯 p.587) : template<typename Type, : bool (*Comp) (const Type&, const Type &)> : const Type& : min (const Type *p, int size, Comp comp) //此行錯誤 : { : //do compare operation : } : 錯誤訊息: : D:\Test\c++\HelloWorld\main.cpp|25|error: 'Comp' is not a type| : ||=== Build finished: 1 errors, 0 warnings ===| : 我照書上打的, 看起來Comp要這樣寫: : typedef bool (*Comp) (const Type&, const Type &); : 但是不清楚怎麼放進去template : 請問要怎麼改才會對? 模板引數給一個函數指標是可行的, 只要這個指標位址在編譯時期 可以找出來, 跟傳整數的原理一樣, 參考下面的例子: http://codepad.org/KkuqYsZY 如果要像上面那樣使用, Comp是傳進來的一個指標, 他不是型態, 所以在 Comp comp 的地方會報錯是理所當然的, 這就好像你寫: void function( int Integer, Integer integer ); 你也可以看到出來的錯誤訊息都一樣: 'Integer' is not a type 在這邊 typename Comp comp 也解決不了問題, 原因同上. 至於下 面的用法: template <typename Type> typedef bool (*Comp) (const Type&, const Type &); 很可惜目前的 C++ 並不包含這樣的語法. 在這邊提出一個替代方案, 改用 trait class另外定義一個函數指 標型態: template <typename Return, typename Parameter> struct FunctionPointer { typedef Return (*Type)( Parameter, Parameter ); }; 就可以進行這樣的應用: http://ppt.cc/kMBg因為這時候需要知道 的只有 Type 的資訊, 所以你本來的函式就可以進而修改成這個樣 子: http://codepad.org/fvljDhnY 上面的程式碼應該可以達成你的需求, 但是只適用於傳入函式指標 的情況, 另外還有作判斷的物件的型態也由編譯器幫我們找出來的 寫法: http://codepad.org/MYB7POXf 程式碼縮短了不少, 也可以傳入 Functor 來使用. -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (01/19 04:03)
walm20:有點看不懂, 所以如果只接function ptr, 最快改法是 01/19 09:51
walm20:min (const Type *p, int size) ? 01/19 09:51
你想做的是「傳入比較準則,以出最小元素」吧? 那麼這個版本就 可以了. http://codepad.org/MYB7POXf
walm20:sorry, 沒講清楚, 因為書上有function object版本, 我要問 01/19 15:21
walm20:的是function pointer的, 原來pointer版這麼複雜... 01/19 15:22
walm20:謝謝你的說明! 01/19 15:23
legnaleurc:functor 版本就支援 function pointer 啦 ... 01/19 17:23
legnaleurc:有什麼限制只能用 function pointer 的理由嗎? = = 01/19 17:24
walm20:單純想知道template+function potinter怎麼寫XD 01/19 19:42
我其中有一個連結就是接函式指標的呀! @_@ http://codepad.org/fvljDhnY 我覺得它簡單很多說
walm20:我有看到啦, 只是還要額外寫個class去包他, 覺得複雜QQ 01/19 23:17
你現在看 code 會覺得很複雜, 等你把新的功能加進來需要改 架構時就會發現這個算簡單的. ※ 編輯: loveme00835 來自: 140.121.197.115 (01/19 23:28)