作者ayumiQmazaky (拜託刪我 爛人)
看板C_and_CPP
標題[問題] Pointer to member 用途
時間Tue Dec 13 22:19:26 2011
最近再想pointer to member 到底use case是什麼
我完全想不到
我看了一些範例
http://tw.myblog.yahoo.com/briclin09/article?mid=83
如上面連結
雖然看得好像懂
但是仔細想想
1. 我明明有他instance了我幹嘛故意寫這種語法繞一圈 去invoke他的member funcion.
2. 我看到的範例都是在main function宣告一個object 然後去刻意用pointer to
member 去呼叫他的function 無法讓我領會這個寫法的奧妙
這網頁有扯到寫一個觀察者 我一直在推敲這種pointer to member的用法
我想寫一個API maintain一個 invoke list 類似C# 的event handler可以+= 一堆
function
如同他網頁的map
1. 如果我要寫這個API 我需要使用者傳入這個class的instance 和 要註冊的function
但矛盾的是 我既然知道這個class的instance了 我幹嘛要用pointer to member去invoke
我直接->呼叫不就好了?
2. 像C#的event 可以註冊 "不同class" 底下的function(只要prototype相同)
我在想C++有沒有辦法 自己寫這種模擬
+= 這operator 就已經讓我不知道怎麼overloading了
但至少我想要寫一個AddFunctionToList 的API可以讓人一直註冊"不同class底下的同型
function"
這有辦法做到嗎?
再思考一下pointer to member的用法會不會變成說
假如我寫個dll 對方寫一隻AP
我跟你說好我們有個class叫做 Foo
我的API開成
typedef int (Foo::*pFun)(void);
AddFunction(Foo* inst, pFunc);
我dll從頭到尾不知道Foo裡面到底有啥
我只宣告class Foo;
然後這API裡面就類似這網頁 maintain一個map並且invoke 這map裡面的 function
如果上面說法成立
可以解釋成
我寫dll 我可以不用知道AP真的把這class Foo裡面定義了多麼花俏
他只要呼叫我這個API我就有辦法invoke到他所有註冊的function.
目前我猜測 這是pointer to member的應用......
但這樣只能處理固定class的function 而無法做到maintain"不同class底下的同型
function" 又可以逐一invoke.
以上 問題有點繁雜且不太好表達
請各位不吝解惑
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.147.15.66
→ diabloevagto:他那樣寫是為了dp的問題 12/13 23:03
推 shadow0326:我自己常用到的狀況是寫function的dispatcher 12/13 23:43
→ shadow0326:例如cgi或是其他protocol handler, 用來根據client輸入 12/13 23:43
→ shadow0326:的command呼叫對應的function 12/13 23:43
→ shadow0326:當指令很多時, 用map + member func ptr就會很簡潔 12/13 23:44
→ shadow0326:我相信design pattern高手們還可以示範出很多花枝招展 12/13 23:45
→ shadow0326:的用法 12/13 23:46
→ ayumiQmazaky:但這樣只為了簡潔 感覺功能很狹隘 12/13 23:47
→ ayumiQmazaky:我一直覺得有那種很奇特的 用途 如同我文章提到 12/13 23:47
→ ayumiQmazaky:但我不會寫= = 12/13 23:48
→ adxis:你說的"不同 class 底下的同型 function" 會在動態多型碰到 12/14 00:15
推 mingtai1:用在template callback function你就知道它的精美之處 12/14 00:16
→ ayumiQmazaky:template callback這是專有詞嗎 我有想到但不會寫... 12/14 00:22
→ ayumiQmazaky:可否給我經典的連結 讓我好好研究一下... 12/14 00:27
推 mingtai1:可以去看boost function/bind 體驗一下 12/14 00:28
→ LifePattern:增加可讀性(簡潔)這個功能並不會很狹隘... 12/14 01:36
→ LifePattern:member funcion ptr 12/14 01:37