3

との間の接続をオーバーライドする必要がありboost::signals2::signalますboost::function。この目的のために、次のテンプレート関数を作成しました。

template<typename T>
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) {
  // override code ...
}

bindこれをできるだけシンプルに活用したいと思います。同様の問題に関する投稿で読んだことから、テンプレートパラメータは関数の引数から推測する必要があります。しかし、私の場合、明示的なパラメーターがない場合、それは機能していません。

boost::signals2::signal<void ()> my_signal;

bind<void ()>(my_signal, boost::bind(&A::func, this)); // this works
bind(my_signal, boost::bind(&A::func, this));          // error: no matching function for call

私は何かが足りないのですか?
明示的なテンプレートパラメータを回避するための回避策はありますか?

4

1 に答える 1

1

2番目の引数の型はではなくstd::function<T>、いくつかのバインド型であるため、コンパイラーはT2番目の関数パラメーターのを推測できません。Tコンパイラーに「 2番目の関数パラメーターでの型が見つからなくても大丈夫です」と伝える必要があります。これは、2番目のパラメーターを非推定コンテキストにすることで実行できます。

template<typename T>
void bind(boost::signals2::signal<T> &signal, 
          typename std::common_type<boost::function<T>>::type function) {
  // override code ...
}
于 2012-07-08T10:20:08.053 に答える