指定内联回调函数作为参数

时间:2010-05-08 23:18:12

标签: c++ function callback inline

首先让我解释一下我正在尝试使用一些伪代码(JavaScript)实现的目标。

// Declare our function that takes a callback as as an argument, and calls the callback with true.
B(func) { func(true); }

// Call the function
B(function(bool success) { /* code that uses success */ });

我希望这说明一切。如果没有,请对我的问题发表评论,以便我可以多写一点来澄清我的问题。

我想要的是在C ++中使用这样的代码。

我曾尝试使用lambda函数,但我无法为这些函数指定参数类型。

2 个答案:

答案 0 :(得分:3)

编辑:再次阅读您的问题,看起来您可能正在寻找C ++中的匿名函数。如果这是你想要的,不幸的是该语言不支持该功能。 C ++要求你现在对这些东西更加冗长。如果您需要的数量超过boost::lamda已经提供给您的数量,那么您应该将它作为正常函数分开。


在C和C ++中,这是使用函数指针或函子和模板(仅限C ++)完成的。

例如(使用C ++方式(仿函数))

//Define a functor. A functor is nothing but a class which overloads
//operator(). Inheriting from std::binary_function allows your functor
//to operate cleanly with STL algorithms.
struct MyFunctor : public std::binary_function<int, int, bool>
{
    bool operator()(int a, int b) {
        return a < b;
    };
};

//Define a template which takes a functor type. Your functor should be
//should be passed by value into the target function, and a functor should
//not have internal state, making this copy cheap.
template <typename Func_T>
void MyFunctionUsingACallback(Func_T functor)
{
    if (functor(a, b))
        //Do something
    else
        //Do something else
}

//Example usage.
int main()
{
    MyFunctionUsingACallback(MyFunctor());
}

使用C方式(函数指针):

//Create a typedef for a function pointer type taking a pair of ints and
//returning a boolean value.
typedef bool (*Functor_T)(int, int);

//An example callback function.
bool MyFunctor(int a, int b)
{
    return a < b;
}

//Note that you use the typedef'd function here.
void MyFunctionUsingACallback(Functor_T functor)
{
    if (functor(a, b))
        //Do something
    else
        //Do something else
}

//Example usage.
int main()
{
    MyFunctionUsingACallback(MyFunctor);
}

请注意,您应该更喜欢C ++方式,因为它允许编译器 除非出于某种原因,否则在内联方面做出更明智的决定 你只限于C子集。

答案 1 :(得分:2)

如果您的编译器是一个相当新的版本(例如Visual Studio 2010或GCC 4.5),您可以使用新C ++标准中的一些新功能,这些功能目前正在批准中,并且很快就会发布。

我不知道在Visual Studio中启用此功能需要做什么,但它应该在MSDN或内部帮助中有详细记录。

对于GCC 4.5,只需添加-std=c++0x选项即可启用新功能。

其中一项功能是Lambda syntax

template <typename F>
void func_with_callback(F f) {
    f(true);
}

int main() {
    func_with_callback( [](bool t){ if(t) cout << "lambda called" << endl; } );
}

如果您无法访问现代编译器,则可以使用仿函数和boost :: lambda等库,这些函数可以执行类似的操作。