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)!