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; // 输出 3

存储 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; // 输出 3

存储函数对象

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; // 输出 3

存储成员函数

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

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; // 输出 15

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; // 输出 3

func = [](int a, int b) { return a * b; };
std::cout << func(1, 2) << std::endl; // 输出 2

通过 std::function,C++ 提供了一种灵活的方法来处理各种可调用对象,使得编写高效、易读和维护的代码变得更加容易。