5

在 c++ 标准库中,几乎所有算法函数都将可调用对象作为参数。现在我想用我的程序试试这个东西。我打开了类似函数的标头,find_ifsearch_n()不太了解这些可调用对象参数的处理方式以及参数如何传递给它们,尤其是对于 lambda 对象(可bind()用于 lambdas,我不知道)


谁能解释一下这东西是如何工作的。提前致谢

4

2 回答 2

13

只需为类函数类型提供一个模板参数并采用该类型的参数:

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。但是,此方法有一个缺点,即编译器不太可能内联您作为func.

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

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

但是,这只会采用函数指针(一些 lambda 可以转换为函数指针)。它不需要函子或任何其他类型的东西。

于 2013-03-05T23:49:27.807 回答
0

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

您的特殊示例: http: //www.cplusplus.com/reference/algorithm/find_if/ find_if 将采用 2 个迭代器,一个作为第一个,另一个作为最后一个,以及一个可调用对象,它将采用您的迭代器指向的对象和返回一个布尔值。

于 2013-03-06T00:02:53.397 回答