3

我有一个静态函数foo,但我想调用的 API 只接受指向函子(类似接口)的指针。有没有办法传递foo给 API?或者我需要根据函子重新实现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 回答