我如何将可调用对象作为参数传递

时间:2013-03-05 23:46:24

标签: c++ stl lambda callable function-object

在c ++标准库中,几乎所有algo函数都将可调用对象作为参数。现在我想用我的程序尝试这个东西。我打开了像find_ifsearch_n()这样的函数的头文件,但是对于如何处理这些可调用对象参数以及如何将参数传递给它们(特别是对于lambda对象)无法理解(can {{1用于lambdas,我不知道)


任何人都能解释一下这件事是如何运作的。提前致谢

2 个答案:

答案 0 :(得分:11)

只需具有类似函数类型的模板参数,并获取该类型的参数:

template <typename Function>
void foo(Function func) {
  // Use func like so
  func(10);
}

标准库算法就是这样做的。你可以用lambda这样调用它:

foo([](int x) { std::cout << (x * 2) << std::endl; });

当然,这需要您在文档中指定您期望的Function类型的函数(直到我们得到Concepts)。它应该是一元吗?二进制?应该采用什么类型的参数?它应该返回什么?

或者,您可以使用std::function

来执行特定类型的功能
int foo(std::function<int(char)> func) {
  return func('a');
}

这一次,foo只接受带有char参数的函数式对象并返回int。但是,这个方法有一个缺点,就是编译器不太可能将你传递的任何lambdas内联为func

将函数作为参数的最基本方法是使用函数指针:

int foo(int (*func)(char)) {
  return func('a');
}

但是,这将获取函数指针(一些lambda可以转换为函数指针)。它不会采用仿函数或其他任何类型。

答案 1 :(得分:0)

所有算法函数必须获得一些函数来测试算法,例如find_if必须知道你想在循环上测试哪个谓词。所有std lib都与模板一起使用,您可以将函数测试作为可调用对象传递。可调用对象是具有重载operator()的对象,使用它,std lib将使用某个参数调用发送的对象,并在必要时获取返回值。您可以找到某些站点上需要的参数和返回值,特别是我总是使用http://www.cplusplus.com/您可以在参考菜单中的所有std lib上找到许多文档。

你的特殊例子: http://www.cplusplus.com/reference/algorithm/find_if/ find_if将使用2个迭代器,一个作为第一个,另一个作为最后一个,以及一个可调用的对象,它将获取迭代器指向的对象并返回一个bool。