如何从`boost :: function <var(void *,=“”var)=“”>`?</var>中获取C指针(如`var(*)(void *,var)`)

时间:2012-12-06 03:02:48

标签: c++ boost boost-function

  

可能重复:
  demote boost::function to a plain function pointer

所以我使用Flash C++ Compiler (aka flascc, alchemy)和havin代码如:

boost::function<var (void*, var)> f = boost::bind(&as3_socket::socket_socketData, this, _1, _2);                   
socket->addEventListener(flash::events::ProgressEvent::SOCKET_DATA, Function::_new(f, NULL));

获取下一个编译器错误:

$ g++ $JN -static -emit-llvm  -c src/utils/http/as3_socket.cpp -I../boost/boost_libraries/install-dir/include
src/utils/http/as3_socket.cpp: In constructor ‘as3_socket::as3_socket()’:
src/utils/http/as3_socket.cpp:75: error: no matching function for call to ‘AS3::ui::Function::_new(boost::function<AS3::ui::var ()(void*, AS3::ui::var)>*, NULL)’
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:179: note: candidates are: static AS3::ui::Function AS3::ui::Function::_new()
/cygdrive/c/Users/Avesta/Downloads/FlasCC_1.0.1134176_11-09-2012/sdk/usr/bin/../../usr/include/AS3++/builtin.h:180: note:                 static AS3::ui::Function AS3::ui::Function::_new(AS3::ui::var (*)(void*, AS3::ui::var), void*)

所以问题是如何从boost::function<var (void*, var)>获得更多C样式var (*)(void*, var)

2 个答案:

答案 0 :(得分:1)

简短的回答是“你不能”。

boost函数对象可能只包含一个函数指针,但它可能是在某些其他函数类型上调用boost::bind ()并绑定某些参数的结果。它也可能包含一个函数对象。

只是因为你可以像调用函数指针一样调用它并不意味着它是指向函数的指针。

[刚注意到 - 上面其他问题的链接非常详细地说明了这一点]

答案 1 :(得分:0)

你问的是错误的问题。

boost::function是一种表达“在将来做某事”的方式,但它不是指向C ++函数的指针。我太强大了,无法作为指向函数的指针。

但是你的回调接口是一个C ++函数,它接受一个void指针和其他东西。通常,您使用void指针和函数指针提供回调。

所以你要做的是创建一个将void指针强制转换为对象的函数,然后将该对象传递给它所调用的其余参数。

确保您投射到无效和返回的类型相同。

您甚至可以将指向boost::function的指针转换为void ptr。

请注意,这会让您遇到管理指向对象的商品的生命周期的问题。糟透了吗?