std::function
std::function
是一个模板类,可以存储任意类型的可调用对象(如函数、lambda表达式、函数对象、成员函数指针等)。其最大的优势是提供了一种通用、多态的方式来存储、复制和调用这些可调用对象。它通常与 std::bind
或 lambda 一起使用来存储已绑定参数的函数调用。
例子:
#include <iostream>
#include <functional>
void print_num(int i) {
std::cout << i << '\n';
}
int main() {
std::function<void(int)> func = print_num;
func(10);
}
std::bind
std::bind
创建一个新的可调用对象,它将给定的函数和参数“绑定”到一起。你可以使用 std::placeholders
来指定哪些参数应该被延迟绑定,即在调用时确定。
例子:
#include <iostream>
#include <functional>
void print_sum(int a, int b) {
std::cout << a + b << '\n';
}
int main() {
auto func = std::bind(print_sum, std::placeholders::_1, 5);
func(10); // 打印 15
}
在这个例子中,我们绑定了 print_sum
函数,使其第二个参数总是 5,而第一个参数在调用时提供。
结合 std::function
和 std::bind
你可以使用 std::bind
来“绑定”函数的一些参数,然后将结果存储在 std::function
对象中。
例子:
#include <iostream>
#include <functional>
void print(int x, int y) {
std::cout << "x: " << x << ", y: " << y << std::endl;
}
int main() {
std::function<void(int)> bound_print = std::bind(print, 42, std::placeholders::_1);
bound_print(24); // 打印 "x: 42, y: 24"
}
在这个例子中,我们绑定 print
函数的第一个参数为 42,而第二个参数由 std::function
对象的调用者提供。
这种结合使得 std::function
和 std::bind
非常灵活,可以很容易地创建和存储具有不同参数和绑定值的函数调用。