c++ - std::function 而不是谓词模板

标签 c++ templates c++11 stl std-function

许多标准库算法都采用谓词函数。然而,这些谓词的类型是任意的,用户提供的模板参数。为什么 C++11 不指定它们采用特定类型,例如 std::function?例如:

template< class InputIt >
InputIt find_if( InputIt first, InputIt last,
             std::function<bool()> p );

使用这个代替模板作为参数类型不是更干净吗?

最佳答案

std::function 用于运行时 多态性。任何特定的 std::function 实例都可以存储任何类型的仿函数(当然,一种适合 std::function 签名的类型)。

标准库算法等是根据其函数参数的类型进行模板化的。因此,它们不需要运行时多态性来完成它们的工作;它们依赖于编译时多态性。

最重要的是,此类算法不需要将运行时多态性的成本强加给您。如果你想要运行时多态性,你可以给它发送一个 std::function 或者其他什么。如果你想要编译时多态性,你可以为它提供一个不使用多态分派(dispatch)的类型(又名:大多数仿函数或函数)。

运行时多态性的代价还包括无法内联函数调用。使用适当的仿函数(或者甚至是函数指针,取决于您的编译器有多好),如果需要,编译器通常可以内联函数调用。使用运行时多态性,您不仅要支付运行时分派(dispatch)的成本(这可能包括额外的参数转发成本),您还会失去重要的优化机会。

关于c++ - std::function 而不是谓词模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409133/

相关文章:

c++ - 为什么 vkCreateSwapchainKHR 会在 0 处导致访问冲突?

c++ - 无法增加 Glib::ustring::iterator(出现 "invalid lvalue in increment"编译器错误)

c++ - 错误: to_string was not declared in this scope

c++ - 无法理解为什么完美转发不起作用

c++ - 已删除的构造函数/运算符的可访问性是否重要?

c++ - 使用 std::function 的重载解析

c++ - 通过libstdc++调试

django 模板,查找字符串替换为其他字符串

c++ - 如何在 C++ 中使用模板制作通用 map

c++ - 可变参数宏