Re: [問題] functor to function pointer

看板C_and_CPP作者 ( )時間10年前發表 (2015/04/29 08:19), 10年前編輯推噓0(002)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《ialk (沒有靈感..)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : MSVC++ 10.0 : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : std : 問題(Question): : runtime error : 預期的正確結果(Expected Output): : print : 1 : 2 : 3 : 錯誤結果(Wrong Output): : access violation : 程式碼(Code):(請善用置底文網頁, 記得排版) : http://ideone.com/1FKquB : 補充說明(Supplement): : 如程式碼,會死在18行 : fp g3 = *g1.target<fp>(); : 請問應該要怎麼寫才是正確的

04/29 12:17,
基本上沒辦法把std::bind回傳的東西轉成func. pointer
04/29 12:17

04/29 12:17,
頂多就 g1.target<decltype(std::bind(f, _1))>() 吧
04/29 12:17

04/29 12:18,
好奇你幹麻不就直接用g1 = f建構就好
04/29 12:18

04/29 12:24,
其實我想做的事是bind一個member function
04/29 12:24

04/29 12:24,
然後傳給一個function pointer
04/29 12:24

04/29 13:02,
基本上function pointer是沒有state的
04/29 13:02

04/29 13:02,
當然如果你可以多傳一個this的話可以參考:
04/29 13:02

04/29 13:02,

04/29 15:28,
bind 出來應該會是某種 anonymous type?
04/29 15:28

04/29 15:28,
就像每個 lambda 的 type 都不一樣
04/29 15:28

04/29 15:29,
我覺得可以直接傳 std::function 的話是最簡單的辦法
04/29 15:29

04/29 15:35,
因為我要call的API是function pointer
04/29 15:35

04/29 15:37,
所以想從std::function bind一個member function傳過去
04/29 15:37
那麼, 實際上轉成 function pointer 時是會丟失資訊的, 這不可能完全對應過去 function pointer 就只能是指到 *某一個* function 的 pointer 萬一可以的話, 那麼 A a1, a2; function<void()> f = bind(&A::member, &a1), g = bind(&A::member, &a2); 這樣 f 跟 g 轉成 function pointer 時位址應該一樣嗎? 假如一樣, 那資訊就丟失了 (因為等同呼叫到同一個函數) 假如不一樣, 就變成有 run-time code generation 要達成這樣的效果, 一定要其他某種方式來得知要呼叫 a1 還是 a2 例如直接靜態就知道是 *哪幾個* 的話, 手動寫 function wrapper void call_a1() { a1.member(); } 否則另外存在某個地方 A *a; void call_a() { a->member(); } a = a1; 無論是何種方式, 我想從原本的問題整體來考量, 應該有機會得到比這兩種寫法更好的作法, 不過這需要多一點原本問題的資訊. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.16.135 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1430295560.A.B73.html

04/29 16:32, , 1F
std::mem_fn ?
04/29 16:32, 1F
無論哪種 case, 都得把 a1/a2 pass 進去 統一的轉成, 如, void(*)(), 是有困難的 ※ 編輯: suhorng (140.112.16.135), 04/29/2015 16:37:04

04/29 18:59, , 2F
基本上我覺得原po直接給個具體的API範例 會比較好回答
04/29 18:59, 2F
同意 ※ 編輯: suhorng (220.137.19.30), 04/29/2015 19:03:36
文章代碼(AID): #1LG9G8jp (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1LG9G8jp (C_and_CPP)