std::function
是 C++11 引入的标准库组件,用于包装任意可调用的目标。它可以用来存储、传递和调用各种类型的可调用对象,如普通函数、Lambda 表达式、函数对象和成员函数等。下面是 std::function
的一些关键特点和用法:
1. 定义和用法
std::function
模板类定义如下:
1 2 3
| #include <functional>
std::function<返回类型(参数类型...)> 函数对象;
|
例如,定义一个接收两个 int
参数并返回 int
的函数对象:
1
| std::function<int(int, int)> func;
|
2. 存储和调用不同类型的可调用对象
存储普通函数
1 2 3 4 5 6
| int add(int a, int b) { return a + b; }
std::function<int(int, int)> func = add; std::cout << func(1, 2) << std::endl;
|
存储 Lambda 表达式
1 2 3
| auto lambda = [](int a, int b) { return a + b; }; std::function<int(int, int)> func = lambda; std::cout << func(1, 2) << std::endl;
|
存储函数对象
1 2 3 4 5 6 7 8 9
| struct Adder { int operator()(int a, int b) const { return a + b; } };
Adder adder; std::function<int(int, int)> func = adder; std::cout << func(1, 2) << std::endl;
|
存储成员函数
1 2 3 4 5 6 7 8 9
| struct Calculator { int add(int a, int b) const { return a + b; } };
Calculator calc; std::function<int(const Calculator&, int, int)> func = &Calculator::add; std::cout << func(calc, 1, 2) << std::endl;
|
3. 捕获上下文
std::function
允许存储并捕获上下文信息,例如 Lambda 表达式中捕获的外部变量:
1 2 3 4
| int x = 10; auto lambda = [x](int a) { return a + x; }; std::function<int(int)> func = lambda; std::cout << func(5) << std::endl;
|
4. 可变性和赋值
std::function
可以动态改变所包装的可调用目标:
1 2 3 4 5
| std::function<int(int, int)> func = [](int a, int b) { return a + b; }; std::cout << func(1, 2) << std::endl;
func = [](int a, int b) { return a * b; }; std::cout << func(1, 2) << std::endl;
|
通过 std::function
,C++ 提供了一种灵活的方法来处理各种可调用对象,使得编写高效、易读和维护的代码变得更加容易。