1

可能重复:
将 boost::function 降级为普通函数指针

所以我使用Flash C++ 编译器(又名 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)

4

2 回答 2

1

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

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

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

[刚刚注意到-上面其他问题的链接详细解释了这一点]

于 2012-12-06T04:01:20.917 回答
0

你问错问题了。

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

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

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

确保您转换为 void 和 back 的类型是相同的。

您甚至可以将指针指向boost::functionvoid ptr。

请注意,这会给您带来管理好指向对象的生命周期的问题。糟透了不是吗?

于 2012-12-06T04:51:18.827 回答