如何从“boost::function<var (void*, var)>”中获取 C 指针(如 'var (*)(vo

How to get C pointer (like `var (*)(void*, var)`) out of `boost::function<var (void*, var)>`?

本文关键字:var 获取 vo 指针 void boost function      更新时间:2023-10-16

可能的重复项:
将提升::函数降级为普通函数指针

所以我使用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/Flasboost::function<var (void*, var)>.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*)

所以问题是如何从CC_1更多的C风格中获得var (*)(void*, var)

简短的回答是"你不能"。

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

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

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

你问错了问题。

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

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

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

确保投射到无效和重新投射的类型相同。

您甚至可以将指向boost::function的指针转到虚空 ptr。

请注意,这给您留下了一个管理指向对象的商品的生命周期的问题。 很糟糕不是吗?