一、function
1、概念
std::function是 C++11 引入的一个通用的函数包装器,它可以存储、复制和调用任何可调用对象,包括:
- 普通函数
- 成员函数
- 函数对象(重载了 operator() 的类)
- lambda 表达式
- 其他函数指针
注意:包装器类型仅仅依赖于调用特征,而不依赖于可调用元素自身的类型。调用特征标是由函数返回值类型及参数列表共同构成。
2、使用场景
2.1、回调机制
在事件驱动或异步编程中作为回调函数
std::function<void(int)> callback;
void register_callback(std::function<void(int)> cb) {
callback = cb;
}
2.2、策略模式
在运行时选择不同的算法或行为
std::function<bool(int, int)> compare;
compare = std::less<int>(); // 使用小于比较
compare = std::greater<int>(); // 切换为大于比较
2.3、存储不同类型的可调用对象
std::vector<std::function<void()>> tasks;
tasks.push_back([](){ std::cout << "Task 1\n"; });
tasks.push_back(std::bind(&SomeClass::method, &obj));
std::function提供了灵活的函数封装能力,是现代 C++ 中实现回调、事件处理和策略模式的重要工具。
3、示例代码
#include <iostream>
#include <functional>
void print_num(int i) {
std::cout << "Number: " << i << '\n';
}
struct Print {
void operator()(int i) const {
std::cout << "Print object: " << i << '\n';
}
};
int main() {
// 存储普通函数
std::function<void(int)> f1 = print_num;
f1(42);
// 存储lambda表达式
std::function<void(int)> f2 = [](int i) {
std::cout << "Lambda: " << i << '\n';
};
f2(43);
// 存储函数对象
std::function<void(int)> f3 = Print();
f3(44);
// 绑定成员函数
struct Foo {
void print(int i) const { std::cout << "Foo: " << i << '\n'; }
};
Foo foo;
std::function<void(int)> f4 = std::bind(&Foo::print, &foo, std::placeholders::_1);
f4(45);
// 检查是否有可调用对象
std::function<void(int)> f5;
if (!f5) {
std::cout << "f5 is empty\n";
}
}
7324

被折叠的 条评论
为什么被折叠?



