作者loveme00835 (最愛朴素妍)
看板C_and_CPP
標題Re: [問題] template function pointer
時間Wed Jan 19 03:40:33 2011
※ 引述《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)