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



在c++标准库中,几乎所有的算法函数都接受一个可调用对象作为参数。现在我想用我的程序试试这个。我打开了函数的头,如find_ifsearch_n(),但不能理解这些可调用的对象参数是如何处理的,当然参数是如何传递给他们的,特别是lambda对象(bind()可以用于lambda,我不知道)


谁能告诉我这东西是怎么用的?提前感谢

只要有一个类函数类型的模板形参,并接受该类型的实参:

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

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

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

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

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

获取特定类型的函数。
int foo(std::function<int(char)> func) {
  return func('a');
}

这一次,foo将只接受接受char实参并返回int的类函数对象。然而,这种方法有一个缺点,那就是编译器不太可能内联任何作为func传递的lambda。

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

int foo(int (*func)(char)) {
  return func('a');
}
然而,这将只接受函数指针(一些lambda可以转换为函数指针)。它不接受函子或其他类似的东西

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

你的特别例子:http://www.cplusplus.com/reference/algorithm/find_if/Find_if将接受两个迭代器,一个作为第一个,另一个作为最后一个,以及一个可调用对象,该对象将接受迭代器指向的对象并返回bool值。

相关内容

  • 没有找到相关文章

最新更新