自学内容网 自学内容网

C++的lambda函数、bind函数、类函数绑定参数,学习测试用例

在C++中,Lambda函数、std::bind 和类函数绑定参数提供了灵活的方式来处理函数调用。

  • Lambda函数是一种匿名函数,可以捕获外部变量并在函数体内使用。它们提供了简洁而强大的方式来定义内联函数。
  • std::bind 用于创建一个新的函数对象,其中部分参数被绑定到固定值,从而减少调用时需要传递的参数数量。
  • 类成员函数可以通过 std::bind 或Lambda表达式进行绑定,允许部分或全部参数提前绑定。

以下代码展示了如何使用Lambda表达式、std::function 和 std::bind 处理普通函数、多参数函数以及类成员函数的绑定和调用。

#include <iostream>
#include <functional>

// 普通函数
void f1(int x) {
    std::cout << "Value: " << x << std::endl;
}
void f1_func(){
    // 使用std::function包装函数指针
    std::function<void(int)> func = f1;

    // 调用函数
    func(1);

    // 使用std::function包装Lambda表达式
    std::function<void(int)> lambdaFunc = [](int x) {
        f1(x);
    };

    // 调用Lambda
    lambdaFunc(2);
}

// 带有多个参数的函数
float f3(int x, int y, int z) {
    std::cout << "Sum: " << (x + y + z) << std::endl;
    return float(x+y+z);
}

int f3_bind() {
    // 使用std::bind绑定函数的部分参数,只留下一个参数
    auto boundFunc = std::bind(f3, std::placeholders::_1, 1, -1);

    // 调用绑定的函数,只需要传递一个参数
    return boundFunc(3); // 输出: Sum: 3
}
int f3_lambda() {
    int b=2,c=-1;
    // 使用std::function包装Lambda表达式
    std::function<float(int)> lambdaFunc = [b,c](int x) {
        return f3(x,b,c);
    };

    // 调用绑定的函数,只需要传递一个参数
    return int(lambdaFunc(3)); // 输出: Sum: 4
}

class MyClass {
private:
    int z=-6;
public:
    float mf2(int x, int y) const {
        std::cout << "Sum: " << (x + y+z)/2 << std::endl;
        return float((x+y+z)/2.);
    }
    int self_mf2(int x){
        int b=4;
        // 使用Lambda表达式绑定对象、参数输入,调用类函数
        std::function<float(int)> mf1 = [this,b](int x){
            return this->mf2(x,b);
        };
        return mf1(x);
    }
};
int mf_bind(MyClass *obj){
     // 使用std::bind绑定成员函数、对象、指定参数输入
    auto boundMemberFunc = std::bind(&MyClass::mf2, obj, std::placeholders::_1, 4);

    return boundMemberFunc(12); // 输出: Sum: 5
}
int mf_lambda(MyClass &obj){
    // 使用Lambda表达式绑定成员函数、对象、指定参数输入
    auto boundMemberFunc = [obj](int x) {
        return obj.mf2(x, 4);
    };
    return boundMemberFunc(14); // 输出: Sum: 6
}
int main() {
    f1_func();

    f3_bind();
    f3_lambda();

    MyClass obj;
    mf_bind(&obj);
    mf_lambda(obj);
    obj.self_mf2(16);// 输出: Sum: 7
    
    return 0;
}

原文地址:https://blog.csdn.net/NICAI001/article/details/139082253

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!