3

私は静的関数を持っていますfooが、呼び出したいAPIは(同様のインターフェースの)ファンクターへのポインターのみを受け入れます。fooAPIに渡す方法はありますか? fooまたは、ファンクターに関して再実装する必要があります。

コード例:

template<typename ReturnType, typename ArgT>
struct Functor: public std::unary_function<ArgT,ReturnType>
{
    virtual ~Functor () {}
    virtual ReturnType operator()( ArgT) = 0;
};


// I have a pre written function
static int foo (int a) {
    return ++a;
}

// I am not allowed to change the signature of this function :(     
static void API ( Functor<int,int> * functor ) {
    cout << (*functor) (5);
}

int main (void) {
    API ( ??? make use of `foo` somehow ??? );
    return 0;
}

私の質問はAPIを呼び出すことです.実装Functorは唯一の解決策ですかfoo、それを渡すために使用できる方法がありAPIますか?

boost::bindここで役立ちますか?
つまりboost::bind(foo, _1)、関数オブジェクトを作成してからfoo、関数オブジェクトから目的のファンクターを形成する方法があれば?

4

1 に答える 1

2

の派生型として独自のファンクターを作成する以外に選択肢がないようですFunctor<int, int>。ただし、ファンクターまたは関数ポインターからインスタンス化できる中間クラス テンプレート ファンクターを提供することで、いくつかの問題を回避できます。

template<typename R, typename A>
struct GenericFunctor<R, A> : public Functor<R, A>
{
    template <typename F>
    MyFunctor(F f) : f_(f) {}
    ReturnType operator()(A arg) = { return f_(arg);}
private:
    std::function<R(A)> f_; // or boost::function
};

それからあなたは言うことができます

GenericFunctor<int, int> fun = foo;
API(&fun);  // works. GenericFinctor<int,int> is a Functor<int,int>

これは、あなたが与えられたものがとてもひどいという事実に対する単なる回避策です.

于 2013-11-05T06:59:51.013 に答える