2

関数をポインターに渡す必要があります。この目的のために、boost::function を使用しています。ポインターをキャッチする関数は、さまざまなシグネチャに対してオーバーロードされます。例えば:

void Foo(boost::function<int ()>) { ... }
void Foo(boost::function<float ()>) { ... }
void Foo(boost::function<double ()>) { ... }

今、私はそこにいくつかのクラスメソッドポインタを渡したい:

class test
{
   public:
      float toCall() { };
};

class Wrapper
{
  Wrapper() {
    test obj;
    Foo(boost::bind(&test::toCall, this));
  }
};


error: no matching function for call to ‘Foo(boost::_bi::bind_t<float, boost::_mfi::mf0<float, test>, boost::_bi::list1<boost::_bi::value<Wrapper*> > >)’
    note: candidates are: Foo(boost::function<float()>&)
4

3 に答える 3

6

ノノノこれは機能しません。boost::function<...>あらゆるタイプを受け入れるテンプレート化されたコンストラクターがあるためです。呼び出し署名との互換性は後でチェックされます。過負荷の解決ではこれを解決できません。

&objまた、の代わりに渡したいと思いますthis。明示的に変換してみてください:

Foo(boost::function<float ()>(boost::bind(&test::toCall, &obj)));

ただし、これはまったく醜いので、typedef を導入することをお勧めします。

void Foo(FloatHandler) { ... }
...
FloatHandler f(boost::bind(&test::toCall, &obj));
Foo(f);

または、最終的にはFoo、呼び出し可能な型だけを受け入れるテンプレートを作成できますTboost::function<...>一般的なケースでは、何にキャストする必要があるのか​​わからないので、それが最も簡単だと思います。を返したい人はどうですかstd::complex<>。そう...

template<typename T>
void Foo(T) { ... }
...
Foo(boost::bind(&test::toCall, &obj));

お役に立てれば。

于 2010-08-30T23:23:54.067 に答える
2

ラインで

Foo(boost::bind(&test::toCall, this));

thisタイプWrapperです。しかし、バインドはtoCallメソッドを見つけることができません。

おそらくあなたがやろうとしている修正バージョン(完全、g ++ 4.3.2でコンパイル)があります:

#include <boost/bind.hpp>
#include <boost/function.hpp>

void Foo(boost::function<int()>) {}
void Foo(boost::function<float()>) {}
void Foo(boost::function<double()>) {}

struct test {
  float toCall() {return 0.0f;}
};

int main(int,char**) {
  test obj;
  boost::function<float()> tgt=boost::bind(&test::toCall,obj);
  Foo(tgt);
  return 0;
}

AndreyT's answer notes にあるように、バインドの戻り値の型は...少し奇妙であるため、適切な関数型への明示的な強制です。

于 2010-08-30T23:26:22.993 に答える
1

boost::bindboost::functionオブジェクトを返しません。対応する数のパラメーターを持つファンクターとして使用できる、指定されていないタイプのオブジェクトを返します。

boost::functionの結果から変換を構築することはできますが、boost::bindこの場合の過負荷の解決は、C++では「複雑すぎます」。(正しい問題を実際に説明していない私の悪い例を削除しました)。

于 2010-08-30T23:16:01.043 に答える