Re: [问题] functor to function pointer

楼主: suhorng ( )   2015-04-29 16:19:17
※ 引述《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>();
: 请问应该要怎么写才是正确的
→ PkmX: 基本上没办法把std::bind回传的东西转成func. pointer 04/29 12:17
→ PkmX: 顶多就 g1.target<decltype(std::bind(f, _1))>() 吧 04/29 12:17
→ PkmX: 好奇你干麻不就直接用g1 = f建构就好 04/29 12:18
→ ialk: 其实我想做的事是bind一个member function 04/29 12:24
→ ialk: 然后传给一个function pointer 04/29 12:24
→ PkmX: 基本上function pointer是没有state的 04/29 13:02
→ PkmX: 当然如果你可以多传一个this的话可以参考: 04/29 13:02
→ PkmX: http://ideone.com/q5k9gX 04/29 13:02
推 suhorng: bind 出来应该会是某种 anonymous type? 04/29 15:28
→ suhorng: 就像每个 lambda 的 type 都不一样 04/29 15:28
→ suhorng: 我觉得可以直接传 std::function 的话是最简单的办法 04/29 15:29
→ ialk: 因为我要call的API是function pointer 04/29 15:35
→ ialk: 所以想从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;
无论是何种方式, 我想从原本的问题整体来考量,
应该有机会得到比这两种写法更好的作法,
不过这需要多一点原本问题的资讯.
作者: PkmX (阿猫)   2014-04-29 12:17:00
基本上没办法把std::bind回传的东西转成func. pointer顶多就 g1.target<decltype(std::bind(f, _1))>() 吧好奇你干麻不就直接用g1 = f建构就好
作者: ialk (没有灵感..)   2014-04-29 12:24:00
其实我想做的事是bind一个member function然后传给一个function pointer
作者: PkmX (阿猫)   2014-04-29 13:02:00
基本上function pointer是没有state的当然如果你可以多传一个this的话可以参考:http://ideone.com/q5k9gX
楼主: suhorng ( )   2014-04-29 15:28:00
bind 出来应该会是某种 anonymous type?就像每个 lambda 的 type 都不一样我觉得可以直接传 std::function 的话是最简单的办法
作者: ialk (没有灵感..)   2014-04-29 15:35:00
因为我要call的API是function pointer所以想从std::function bind一个member function传过去
作者: bibo9901 (function(){})()   2015-04-29 16:32:00
std::mem_fn ?
作者: PkmX (阿猫)   2015-04-29 18:59:00
基本上我觉得原po直接给个具体的API范例 会比较好回答

Links booklink

Contact Us: admin [ a t ] ucptt.com