4

boost::signalのトリガーをboost::bindオブジェクトにラップしようとしています。したがって、私が欲しいのは、boost :: functionが呼び出されたときに、いくつかの事前にパッケージ化された引数を使用してシグナルを呼び出すことです。

私が持っているのはこれです:

boost::signals2::signal<void(int)> sig;
boost::function<void()> f = boost::bind(
    &(sig.operator()), &sig, 10);

しかし、これは機能しません。次のエラーが発生します:エラー:bind(、..。の呼び出しに一致する関数がありません

私もこれを試しました:

boost::function<void()> f = boost::bind(
    (void(boost::signals2::signal<void(int)>::*)(int))
    &(sig.operator()), &sig, 10);

しかし、「コンテキスト型情報のないオーバーロードされた関数のアドレス」を取得します。

では、これに適した構文は何ですか?

4

1 に答える 1

11

boost :: signal2 :: signalのインスタンスは関数オブジェクト(別名ファンクター)であり、ここで説明するように直接バインドできます。この場合の唯一の問題は、シグナルがコピーできないため、bindによって返されるオブジェクトにコピーできないことです。したがって、最初にboost::refでラップする必要があります。次に例を示します。

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>

int main(void)
{
  boost::signals2::signal<void(int)> sig;
  boost::function<void()> f = boost::bind(boost::ref(sig), 10);
}
于 2010-09-22T01:54:26.090 に答える