我有一个静态函数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
中的函数对象生成,然后是否有办法从函数对象中形成所需的函子?
答案 0 :(得分: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>
这只是一个解决方法,因为你给的东西太可怕了。