[問題] Pointer to member 用途

看板C_and_CPP (C/C++)作者 (拜託刪我 爛人)時間14年前 (2011/12/13 22:19), 編輯推噓3(3018)
留言21則, 7人參與, 最新討論串1/3 (看更多)
最近再想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

12/13 23:03, , 1F
他那樣寫是為了dp的問題
12/13 23:03, 1F

12/13 23:12, , 2F
http://ppt.cc/zwB, 可以參考這篇
12/13 23:12, 2F

12/13 23:23, , 3F
12/13 23:23, 3F

12/13 23:43, , 4F
我自己常用到的狀況是寫function的dispatcher
12/13 23:43, 4F

12/13 23:43, , 5F
例如cgi或是其他protocol handler, 用來根據client輸入
12/13 23:43, 5F

12/13 23:43, , 6F
的command呼叫對應的function
12/13 23:43, 6F

12/13 23:44, , 7F
當指令很多時, 用map + member func ptr就會很簡潔
12/13 23:44, 7F

12/13 23:45, , 8F
我相信design pattern高手們還可以示範出很多花枝招展
12/13 23:45, 8F

12/13 23:46, , 9F
的用法
12/13 23:46, 9F

12/13 23:47, , 10F
但這樣只為了簡潔 感覺功能很狹隘
12/13 23:47, 10F

12/13 23:47, , 11F
我一直覺得有那種很奇特的 用途 如同我文章提到
12/13 23:47, 11F

12/13 23:48, , 12F
但我不會寫= =
12/13 23:48, 12F

12/14 00:15, , 13F
你說的"不同 class 底下的同型 function" 會在動態多型碰到
12/14 00:15, 13F

12/14 00:16, , 14F
用在template callback function你就知道它的精美之處
12/14 00:16, 14F

12/14 00:22, , 15F
template callback這是專有詞嗎 我有想到但不會寫...
12/14 00:22, 15F

12/14 00:27, , 16F
可否給我經典的連結 讓我好好研究一下...
12/14 00:27, 16F

12/14 00:28, , 17F
可以去看boost function/bind 體驗一下
12/14 00:28, 17F

12/14 01:36, , 18F
增加可讀性(簡潔)這個功能並不會很狹隘...
12/14 01:36, 18F

12/14 01:37, , 19F
http://ppt.cc/sQ@W 看第一個例子,想像一下改成存
12/14 01:37, 19F

12/14 01:37, , 20F
member funcion ptr
12/14 01:37, 20F

12/14 11:40, , 21F
http://goo.gl/wj06T 參考這篇看看
12/14 11:40, 21F
文章代碼(AID): #1Evrxmov (C_and_CPP)
文章代碼(AID): #1Evrxmov (C_and_CPP)