#include 是什么作用
#include <functional>
是 C++ 标准库中的一个头文件,它提供了一系列与函数对象(function objects,也称为仿函数 functors)相关的工具,包括函数包装器、绑定器和其他用于函数式编程的组件。这个头文件在 C++11 及以后的版本中尤为重要,因为它引入了许多强大的功能。
主要功能和作用:
-
函数包装器
std::function
std::function
是一个通用的函数包装器,可以存储、复制和调用任何可调用对象(如普通函数、成员函数、Lambda 表达式、仿函数等)。- 示例:
#include <functional> #include <iostream>void print_hello() {std::cout << "Hello, world!" << std::endl; }int main() {std::function<void()> func = print_hello;func(); // 调用存储的函数return 0; }
-
绑定器
std::bind
std::bind
用于部分应用(partial application)或参数绑定,可以将函数的某些参数固定,生成一个新的可调用对象。- 示例:
#include <functional> #include <iostream>void print_sum(int a, int b) {std::cout << a + b << std::endl; }int main() {auto binded_func = std::bind(print_sum, 10, std::placeholders::_1);binded_func(20); // 输出 30(10 + 20)return 0; }
-
占位符
std::placeholders
- 配合
std::bind
使用,用于标记未绑定的参数位置(如_1
、_2
等)。
- 配合
-
标准仿函数(如
std::plus
,std::less
等)- 提供了一些预定义的函数对象,用于算术、比较和逻辑运算。
- 示例:
#include <functional> #include <algorithm> #include <vector>int main() {std::vector<int> v = {1, 2, 3, 4, 5};std::sort(v.begin(), v.end(), std::greater<int>()); // 降序排序return 0; }
-
Lambda 表达式的支持
- 虽然 Lambda 表达式是语言特性,但
std::function
可以存储和操作 Lambda 表达式。
- 虽然 Lambda 表达式是语言特性,但
使用场景:
- 需要将函数作为参数传递(如回调函数)。
- 需要延迟调用或部分绑定参数。
- 需要统一处理不同类型的可调用对象(如函数指针、Lambda、成员函数等)。
总结:
<functional>
是 C++ 中实现函数式编程的重要工具,提供了灵活的方式来操作函数和可调用对象,尤其在泛型编程和事件处理中非常有用。