1.概要
std::function 是 C++11 引入的一个通用、多态的函数封装器。它可以存储、复制和调用任何 Callable 目标 —— 函数、Lambda 表达式、bind 表达式或其他函数对象。这使得 std::function 成为一个非常强大的工具,可以用来表示和操作一般的可调用对象。
2.代码
下面是一个简单的 std::function 实验,展示了如何使用它来存储不同类型的可调用对象,并调用它们:
#include <iostream>
#include <functional> // 包含 std::function 的头文件 // 一个简单的函数
int add(int a, int b) { return a + b;
} // 一个函数对象(也称为仿函数)
struct Multiply { int operator()(int a, int b) const { return a * b; }
}; int main() { // 使用 std::function 存储一个普通函数 std::function<int(int, int)> func1 = add; int result1 = func1(3, 4); // 调用 func1,相当于调用 add(3, 4) std::cout << "Result 1: " << result1 << std::endl; // 输出: Result 1: 7 // 使用 std::function 存储一个 Lambda 表达式 std::function<int(int, int)> func2 = [](int a, int b) { return a - b; }; int result2 = func2(7, 3); // 调用 func2,执行 Lambda 表达式 std::cout << "Result 2: " << result2 << std::endl; // 输出: Result 2: 4 // 使用 std::function 存储一个函数对象 std::function<int(int, int)> func3 = Multiply(); int result3 = func3(5, 6); // 调用 func3,相当于调用 Multiply()(5, 6) std::cout << "Result 3: " << result3 << std::endl; // 输出: Result 3: 30 // std::function 也可以接受没有参数的 Callable 对象 std::function<void()> func4 = []() { std::cout << "Hello, std::function!" << std::endl; }; func4(); // 调用 func4,输出 "Hello, std::function!" return 0;
}
3.运行结果
Result 1: 7
Result 2: 4
Result 3: 30
Hello, std::function!
4.代码说明
在这个例子中,我们定义了三个不同类型的可调用对象:一个普通的函数 add,一个函数对象 Multiply,以及一个 Lambda 表达式。我们创建了三个 std::function 对象 func1、func2 和 func3,分别用于存储这些可调用对象。然后,我们通过调用这些 std::function 对象来执行相应的操作,并打印结果。
5.补充说明
最后,我们还展示了如何使用 std::function 存储一个不接受任何参数的可调用对象(在这种情况下是一个 Lambda 表达式),并通过调用它来执行操作。
std::function 的强大之处在于它的多态性:你可以使用相同的 std::function 对象来存储不同类型的可调用对象,并在需要时调用它们。这使得代码更加灵活和可重用。