声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。
std::function
是 C++ 标准库中的一个 函数包装器,用于存储、复制、调用任何可以调用的目标(如普通函数、lambda 表达式、函数对象、成员函数等)。它提供了一种通用的方式来处理不同类型的可调用对象。
基本特性
std::function
可以存储多种类型的可调用对象,并通过统一的接口调用它们。- 其定义在头文件
<functional>
中。 - 它的主要作用是让不同类型的可调用对象能够通过相同的接口来使用,消除了使用模板时的复杂性。
基本语法
#include <functional>
#include <iostream>
std::function<return_type(arg_types...)> func;
return_type
是目标函数的返回类型。arg_types...
是参数列表。
示例代码
1. 使用普通函数
#include <functional>
#include <iostream>
void hello() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
std::function<void()> func = hello; // 存储普通函数
func(); // 调用函数
return 0;
}
2. 使用 Lambda 表达式
#include <functional>
#include <iostream>
int main() {
std::function<int(int, int)> func = [](int a, int b) { return a + b; };
std::cout << "Sum: " << func(2, 3) << std::endl; // 输出: Sum: 5
return 0;
}
3. 使用函数对象
#include <functional>
#include <iostream>
struct Multiply {
int operator()(int a, int b) const {
return a * b;
}
};
int main() {
std::function<int(int, int)> func = Multiply(); // 存储函数对象
std::cout << "Product: " << func(4, 5) << std::endl; // 输出: Product: 20
return 0;
}
4. 使用成员函数
#include <functional>
#include <iostream>
class Foo {
public:
void display(int i) {
std::cout << "Value: " << i << std::endl;
}
};
int main() {
Foo foo;
std::function<void(Foo&, int)> func = &Foo::display; // 存储成员函数
func(foo, 10); // 调用成员函数
return 0;
}
主要用途
- 回调函数:将不同类型的回调封装在一起,可以在需要回调的地方灵活调用。
- 函数作为参数传递:使用
std::function
可以将不同类型的可调用对象作为函数参数传递,而无需在模板中显式指定类型。 - 事件处理系统:可以用来封装不同的事件处理器,例如 GUI 编程中的按钮点击事件等。
注意事项
std::function
带来了一定的开销,因为它在底层进行了一些类型擦除和动态分配。对于高性能要求的场景,建议使用更轻量的方式,如直接使用模板或函数指针。