3
class Foo 
{
    double f1( int x, std::string s1 );
    double f2( int x, SomeClass s2 );
}

本質的に作成するfooのインスタンスなしでFoo.f1のs1をバインドできるようにしたい

typedef double (Foo::* MyFooFunc)( int ) 

MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
MyFooFunc func2 = boost::bind( &Foo::f2, _1, _2, SomeClass );

次に、func1とfunc2をパラメーターとして他の関数に渡します。この関数内で、Fooは最終的にバインドされます。

void SomeOtherFunction( MyFooFunc func )
{
     Foo foo;
     boost::function< double (int) > finalFunc =
          boost::bind( func, foo, _1 );
}

質問:これは可能ですか?はいの場合、1)それを達成する方法は?2)MyFooFuncの宣言は何ですか?

4

2 に答える 2

4
typedef double (Foo::* MyFooFunc)( int );

MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );

の結果はboost::bindメンバーへのポインタではないためfunc1、2行目でそのように初期化することはできません。の結果boost::bindは、指定されていないタイプです(パラメーターによって異なります)。C ++ 0xを使用している場合、への呼び出しの結果に名前を付ける最も簡単な方法bindは、次を使用することautoです。

auto func1 = boost::bind( &Foo::f1, _1, _2, "some string" );

もう1つの簡単な方法(C ++ 03に限定されない)は、結果に名前を付けるのではなく、その場で使用することです。

SomeOtherFunction(boost::bind(&Foo::f1, _1, _2, "some string"));

または、型消去を使用して、の結果をに保存することもできますboost::bindboost::functionこれは、使い慣れているようです。boost::function<double(Foo&, int)>可能性はありますが、唯一の選択肢ではありません。


ここで、:の適切な署名を見つける必要がありますSomeOtherFunction。ここでも、への呼び出しの結果からメンバーへのポインターを初期化できないためboost::bind、機能しvoid SomeOtherFunction(MyFooFunc func);ません。代わりに、関数をテンプレートにすることができます。

template<typename Func>
void SomeOtherFunction( Func func )
{
     Foo foo;
     boost::function< double (int) > finalFunc =
          boost::bind( func, foo, _1 );
}

テンプレートが好ましくない場合は、もう一度、などのある種の型消去を使用する必要がありますboost::function

void SomeOtherFunction(boost::function<double(Foo&, int)> const& func);

(もう一度boost::function、ref-to-non-constではなくref-to-constを渡すなどの詳細に応じて、他のタイプも可能です)

于 2011-08-05T15:27:20.863 に答える
0

これを試して:

boost::bind(&Foo::f1, object, _1, _2);

objectクラスFooのインスタンスです。_1と_2は引数のプレースホルダーです。

于 2011-08-05T14:32:26.230 に答える