3

私は2つの機能を持っていf()ますg(). 毎回順番に呼んでいきたいです。私boost::functionはこれを行うことができますか?例:

boost::function functor = boost::bind( boost::bind(f), boost::bind(g) );

これをさらに拡張して、引数が必要だとすると、必要なのは一連の責任です。各ノードは引数を使用して何かを行い、その後にチェーンの次のノードが続きます。それ、どうやったら出来るの?


Update Seth Carnegie のコメントに感謝します。私が本当に望んでいるのは、責任の連鎖を単一の に構築する方法であり、連鎖のboost::function各ノードは を使用して構築できますboost::bind()

4

3 に答える 3

2

boost::signal の使用を検討しましたか?

boost::signal を使用すると、複数の関数呼び出しを 1 つに接続できます。

#include <boost/signal.hpp> 
#include <iostream> 

void f() 
{ 
  std::cout << " Hello" << std::flush; 
} 

void g() 
{ 
  std::cout << " World" << std::endl; 
} 

int main() 
{ 
  boost::signal<void ()> s; 
  s.connect(f); 
  s.connect(g); 
  s(); 
} 
于 2012-01-27T07:36:09.863 に答える
1

boost::lambda とコンマ演算子を使用すると、非常に簡単な解決策があります。私の場合、次のように定義された修飾子関数に使用しています(Bはたとえば任意のクラスであり、Aは変更する必要があるがBに存在し、外に出てはならないクラスです)

void B::modify( boost::function<void(A&)> func );

私の意図は、モディフィケータのみを変更機能に渡すことです。これにより、変更されたときに制御をより簡単に取得できます(たとえば、信号を送信するため)。

2 つの修飾子を適用したい場合があります。

void A::setInvalid();
void A::setX( int x );

方法ではない2つのステップで呼び出します(modifyメソッドの使用方法を示すための参照として):

instanceA->modify( 
    boost::bind( &A::setInvalid, _1 );
instanceA->modify( 
    boost::bind( &A::setX, _1, 4 );

boost::lambda を使用すると、これを 1 つの関数呼び出しに結合できるため、作成される関数は 1 つだけです。

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

using namespace boost::lambda;
instanceA->modify(
    ( bind(&A::setInvalid, boost::lambda::_1)
    , bind(&A::setX, boost::lambda::_1, 4) ) );

あなたの質問に関連して、これは次のようになります。

using namespace boost::lambda;
boost::function<void()> func = ( bind(f), bind(g) )
于 2015-01-20T16:45:32.847 に答える
1

なぜこのようなものではないのですか?

#include <functional>

template <typename FirstFunctor, typename SecondFunctor>
void chainFunctionImpl(FirstFunctor first, SecondFunctor second)
{
   first();
   second();
}

template <typename FirstFunctor, typename SecondFunctor>
std::function<void(void)> chainFunction(FirstFunctor first, SecondFunctor second)
{
   return std::bind(chainFunctionImpl<FirstFunctor,SecondFunctor>,first,second);
}

使い方は比較的簡単で、関数を順番にバインドしてから結果を呼び出すだけです。理論的には、任意の長さの関数を連鎖させることができます。

理論的には、引数をチェーンに渡すことでこれを行うことも可能ですが、そのレベルのテンプレート foo は私をはるかに超えています。http://ideone.com/Xvp5Uは諦めたところです。

于 2012-01-27T05:51:12.397 に答える