看板 C_and_CPP 關於我們 聯絡資訊
最近再想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
diabloevagto:http://ppt.cc/zwB, 可以參考這篇 12/13 23:12
diabloevagto:http://ideone.com/cycXp 參考看看 12/13 23:23
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:http://ppt.cc/sQ@W 看第一個例子,想像一下改成存 12/14 01:37
LifePattern:member funcion ptr 12/14 01:37
Chikei:http://goo.gl/wj06T 參考這篇看看 12/14 11:40