首先让我解释一下我正在尝试使用一些伪代码(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函数,但我无法为这些函数指定参数类型。
答案 0 :(得分:3)
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等库,这些函数可以执行类似的操作。