6

typeと呼ばれる任意のシグネチャを持つboost::functionがあると仮定しCallbackTypeます。

  • boost::bindCallbackTypeと同じ引数を取りながら、2つのファンクターを連続して呼び出す関数を作成するために使用することは可能ですか?

私はどんな潜在的な解決策にもオープンですが、ここに...

magic...いくつかのテンプレートを使用した架空の例:

Template<typename CallbackType>
class MyClass
{
    public:
        CallbackType doBoth;

        MyClass( CallbackType callback )
        {
            doBoth = bind( magic<CallbackType>, 
                             protect( bind(&MyClass::alert, this) ),   
                               protect( callback )                    );
        }

        void alert()
        {
            cout << "It has been called\n";
        }
};

void doIt( int a, int b, int c)
{
    cout << "Doing it!" << a << b << c << "\n";
}

int main()
{
    typedef boost::function<void (int, int, int)> CallbackType;

    MyClass<CallbackType> object( boost::bind(doIt) );

    object.doBoth();

    return 0;
}
4

2 に答える 2

8

Boostは、バインドされた関数のシーケンスを作成する方法をすでに提供しています。Lambdaのコンマ演算子を使用します。

using namespace boost::lambda;
MyClass mc;
CallbackType object = (bind(&MyClass::alert, mc), bind(doIt, _1, _2, _3));
object(1, 2, 3);

これにより、新しいファンクターが作成されますobject。3つの引数を使用してそのファンクターを呼び出すと、mc.alert()それらの引数をに渡す前に呼び出されdoItます。括弧は重要です。

上記の私の例が機能alertするには、const関数である必要があります。非constにする必要がある場合は、ポインタmcに渡すか、でラップしboost::ref(mc)ます。bindまた、Boost.BindではなくBoost.Lambdaを使用する必要があります。後者は、Lambdaの関数結合演算子(特にコンマ)と互換性がありません。

于 2010-05-14T17:52:20.880 に答える
1
template< class Callback >
struct pre_caller {
    Callback c;

    pre_caller( Callback in_c ) : c( in_c ) {}

    void alert() {} // or an instance of a functor

    operator()
    { alert(); c(); }

    template< class T1 >
    operator( T1 a ) // not sure if/what qualification to add to a
    { alert(); c( a ); } // or whether to attempt to obtain from
                         // function_traits<Callback>?
    template< class T1, class T2 >
    operator( T1 a, T2 b )
    { alert(); c( a, b ); }

    template< class T1, class T2, class T3 >
    operator( T1 a, T2 b, T3 c )
    { alert(); c( a, b, c ); }

    // ad nauseam... and I mean nausea, maybe read up on Boost Preprocessor.
};

Boost Bindは、可変個引数のブードゥーに多くのプリプロセッサハッキングを使用しますが、残念ながら、これが本質的にはヘッドパッチのパターンやツールを提供するとは思いません。

于 2010-04-30T06:30:17.317 に答える