std::function 是 C++ 标准库中的一个模板类,用于封装可调用对象(函数、函数指针、函数对象、Lambda 表达式等)的通用接口。它可以用于实现函数的类型擦除和运行时多态。
使用 std::function 的一般步骤如下:
包含头文件:
#include <functional>
定义 std::function 对象:
std::function<return_type(arg_types)> func;
这里的 return_type 是函数的返回类型,arg_types 是函数的参数类型。
给 std::function 对象赋值一个可调用对象:
func = some_function;
或者使用 Lambda 表达式:
func = [](int x) { return x * 2; };
调用 std::function 对象:
return_type result = func(args);
这里的 args 是调用时传递给函数的参数。
以下是一个完整的示例代码,演示了如何使用 std::function:
#include <iostream>
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
std::function<int(int, int)> func;
func = add;
int result = func(3, 4);
std::cout << "Result: " << result << std::endl;
func = [](int x, int y) { return x * y; };
result = func(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
在上面的示例中,我们首先将 func 赋值为 add 函数,然后调用 func(3, 4) 输出结果 7。接着,我们将 func 赋值为一个 Lambda 表达式,并再次调用 func(3, 4) 输出结果 12。
总结来说,std::function 提供了一种方便的方式来存储和调用不同类型的可调用对象,以实现运行时的灵活性和多态性。
std::bind()
在 C++ 中,可以使用 std::bind 函数,通过部分应用(Partial Application)或者参数绑定的方式创建一个新的可调用对象。
std::bind 可以将一个可调用对象与其参数绑定,并返回一个新的可调用对象。这个新的可调用对象可以延迟执行原始可调用对象,或者更改参数的顺序、绑定额外的参数。
使用 std::bind 需要包含头文件 。
一般的使用方式如下:
#include <iostream>
#include <functional>
void printSum(int a, int b) {
std::cout << a + b << std::endl;
}
int main() {
auto addFiveToValue = std::bind(printSum, 5, std::placeholders::_1);
addFiveToValue(10); // 输出 15
return 0;
}
在上述示例中,我们定义了一个函数 printSum,它接受两个整数并打印它们的和。然后,使用 std::bind 函数创建了一个新的可调用对象 addFiveToValue,它绑定了 printSum 函数和常数 5,并将其作为第一个参数。我们使用 std::placeholders::_1 来表示待传递的第二个参数。
当我们调用 addFiveToValue(10) 时,实际上会调用 printSum(5, 10),输出结果为 15。
以下是一些 std::bind 的常见使用场景:
部分应用:绑定部分参数以创建一个接受较少参数的可调用对象。
参数重排序:调整原始可调用对象的参数顺序。
绑定成员函数:将成员函数绑定为可调用对象,并指定对象的指针或引用作为第一个参数。
总结来说,std::bind 允许你通过部分应用或参数绑定的方式创建一个新的可调用对象。这在需要延迟执行函数、改变参数顺序或固定部分参数的情况下非常有用。