std::function<…>的使用

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 允许你通过部分应用或参数绑定的方式创建一个新的可调用对象。这在需要延迟执行函数、改变参数顺序或固定部分参数的情况下非常有用。

猜你喜欢

转载自blog.csdn.net/neuzhangno/article/details/132213833