如何将函数对象作为回调c ++传递给函数

时间:2014-08-30 08:40:04

标签: c++ functor

很少跟进:C++ lambda function without C++0x?

我已经将lambda函数创建为没有c0x

的函数对象

现在的问题是:

  • 如何将它作为回调/函数指针传递给另一个函数?

我的第一次尝试是这样的,但它不起作用:

Lambda Obj( C, D);
command ( Obj.operator()(typeA A, typeB B));

我想早点标记另一个问题,所以没有人看过编辑。

2 个答案:

答案 0 :(得分:2)

如果您在std::functionstd::tr1::function或通过编译器升级找不到std::function ...

编写您自己的std::function - 类似橡皮擦,或使用boost,或使用“最快的代表”(应该谷歌完全实现),或传递{{1} }指针和方法指针为this - 类型推导的函数参数,或者将函数对象的template - 类型推导的副本传递给函数。

请注意,最后两个选项需要公开函数的主体(例如在头文件中)。

或者将函数对象转换为template样式C回调。

我会使用C ++ 11,并且失败那个void*,并且失败那个快速委托,没有自己写一个类型的橡皮擦,在标题和模板+中传递一个副本没有通过副本(除非函数很简单,在这种情况下首先这样做,并且没有那种pvoid C风格。

答案 1 :(得分:1)

使用Boost.Bind

void command(boost::function<void()> func)
{
    func();
}

Lambda Obj(C, D);
command(boost::bind<void>(Obj, A, B));

(或者你可能想要):

void command(boost::function<retType(typeA, typeB)> func)
{
    retType ret = func(A, B);
}

Lambda Obj(C, D);
command(boost::bind<retType>(Obj, _1, _2)); // placeholders

使用模板( STL的方式):

template <typename F>
void command(F func)
{
    func(A, B);
}

Lambda Obj(C, D);
command(Obj);

Live demo link.