std::function 是 C++11 的可调用对象包装器,能统一处理函数、lambda、成员函数等,常用于回调、任务队列等场景,语法为 std::function<返回类型(参数)>,支持空状态检查,虽有性能开销但使用灵活。

std::function 是 C++11 引入的一个通用可调用对象包装器,定义在 <functional> 头文件中。它可以封装、存储和调用任何可调用的目标,比如普通函数、lambda 表达式、函数对象(仿函数)、成员函数指针以及 bind 表达式等。
基本语法
std::function 的模板参数是函数签名,格式为:
std::function<返回类型(参数类型列表)>例如:
- std::function<int(int, int)> 可以保存接受两个 int 并返回 int 的可调用对象。
- std::function<void()> 可以保存无参无返回值的函数。
封装普通函数
可以将普通函数赋值给 std::function 对象:
立即学习“C++免费学习笔记(深入)”;
void greet() {std::cout << "Hello!" << std::endl;
}
std::function<void()> func = greet;
func(); // 输出: Hello!
配合 Lambda 使用
lambda 表达式是最常见的使用场景之一:
std::function<int(int, int)> add = [](int a, int b) {return a + b;
};
std::cout << add(3, 4); // 输出: 7
作为函数参数传递
std::function 常用于回调机制,把函数作为参数传入另一个函数:
void execute(std::function<void()> callback) {callback();
}
execute([]{ std::cout << "Callback called!" << std::endl; });
存储到容器中
可以把不同类型的可调用对象存入 vector 等容器:
std::vector<std::function<void()>> tasks;tasks.push_back([]{ std::cout << "Task 1\n"; });
tasks.push_back(greet);
for (auto& task : tasks) {
task();
}
绑定成员函数
结合 std::bind 或 lambda 可以绑定类的成员函数:
struct Calculator {int add(int a, int b) { return a + b; }
};
Calculator calc;
std::function<int(int, int)> func = std::bind(&Calculator::add, &calc, std::placeholders::_1, std::placeholders::_2);
std::cout << func(2, 3); // 输出: 5
或者用 lambda 更简洁:
std::function<int(int, int)> func = [&calc](int a, int b) {return calc.add(a, b);
};
空状态检查
std::function 可以像指针一样判断是否为空:
std::function<void()> func;if (func) {
func();
} else {
std::cout << "func is empty";
} 基本上就这些常见用法。std::function 提供了灵活的抽象能力,特别适合需要统一处理各种可调用对象的场景,比如事件回调、任务队列、策略模式等。虽然有一定性能开销(涉及类型擦除),但在大多数应用中是可以接受的。











