1

重複の可能性:
boost::function を単純な関数ポインターに降格する

だから私はFlash C++ Compiler(別名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::bind ()他の関数型を呼び出してパラメーターの一部をバインドした結果である可能性があります。関数オブジェクトが含まれる場合もあります。

関数へのポインターのように呼び出すことができるからといって、それが関数へのポインターであるとは限りません。

[今気づきました - 上記の他の質問へのリンクはこれを非常に詳細に説明しています]

于 2012-12-06T04:01:20.917 に答える
0

あなたは間違った質問をしています。

boost::functionは「将来的に何かをする」という表現方法であり、C++ 関数へのポインタではありません。これは強すぎて、関数へのポインターとして適合しません。

ただし、コールバック インターフェイスは、void ポインターなどを受け取る C++ 関数です。通常、void ポインターと関数ポインターの両方をコールバックに提供します。

したがって、void ポインターをオブジェクトにキャストする関数を作成し、そのオブジェクトに、それが呼び出された残りの引数を渡します。

void にキャストして戻す型が同一であることを確認してください。

ポインターをboost::functionvoid ptr に変換することもできます。

これにより、適切なオブジェクトの有効期間を管理するという問題が残ることに注意してください。最悪ですよね?

于 2012-12-06T04:51:18.827 に答える