2017-07-10 19 views
0

boost :: asio操作を呼び出すライブラリモジュールを作成しようとしています。このモジュールは、結果に基づいて、さらに処理するためにアプリケーションロジックレイヤーによって使用されます。boost :: bindコールバックを引数として取り出す関数の定義方法

私の要件は単純で簡単です。私が必要とするのは、以下の私のUtilクラスのコールバックfnを指定すること、関数ptr、boost :: bind(メンバfn)を呼び出すこと、その他のコールバックを呼び出すことです。 。

class Util { 
    public: 
    void sendMsg(const Msg& m, <some callback fn here...>) { 
     // Make a call to boost::asio approximately as below.. 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
        boost::bind(&tcp_connection::handle_write, shared_from_this(), 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred)); 

     // Here, I want to pass the "<some callback fn here>" to async_write, 
     // instead of calling boost::bind here. How to do that? 
    } 
}; 

だから、私の具体的な質問が..です 何私のSENDMSG署名は次のようになりますか?私はfnシグネチャ、特にコールバック部分に到達できません。

これを行う方法を教えてくださった皆様に感謝します。あなたはラムダへのアクセス権を持っている場合は

+0

'のstd :: function'を受け入れるのは簡単ですか!テンプレート型ですか? – Arcinde

+0

大丈夫です。私は最近、C++の多くでタッチを失った。あなたは親切に簡単な例を提供できますか?pls –

+1

ok、thxヒント。私はそれを持っているようです。私は古き良き学校のC++です。ブースト、非同期のものに慣れる。 –

答えて

0

は、それが

class Util { 
    public: 
    template <typename _Proc> 
    void sendMsg(const Msg& m, _Proc proc) 
    { 
     shared_ptr<Util> pThis = shared_from_this; 
     boost::asio::async_write(socket_, boost::asio::buffer(message_), 
      [&proc, =pThis/* , etra args */](boost::...::error_code ec, size_t bytes) // <- use capture to pass extra agruments and shared ptr 
      { 
       // use pThis ! 
       proc(/* etra args */); 
       // or pthis->proc() 
      }); 
     } 

}; 

これは、ラムダなどのstd /ブースト::機能

+0

ありがとうございます。しかしUtilクラスのためのY shared_ptr? Util :: sendMsgの呼び出し側は、async_writeに渡すコールバックfnを提供することになっています。いいえ? –

+0

shared_ptrは、bind()の呼び出し、またはラムダキャプチャのいずれかによって、呼び出しオブジェクトに値渡しされます。 I/O操作または保留中のタイマーが存在する間、オブジェクトを生きた状態に保つことは唯一の目的です。 'this'は、クライアントとの会話が終了したときに自動的に破棄されます。通常は、メッセージスマートポインタが渡されます。 –

関連する問題