早期的 bind 雏形: std::bind1st / std::bind2nd (不推荐使用,C++17 中移除)
- – 具有了 bind 的基本思想,但功能有限
std::bind ( C++11 引入):用于修改可调用对象的调用方式
- – 调用 std::bind 时,传入的参数会被复制,这可能会产生一些调用风险
- – 可以使用 std::ref 或 std::cref 避免复制的行为
std::bind_front ( C++20 引入): std::bind 的简化形式
bind使用定义于头文件 < functional >
函数 | 描述 |
---|---|
std::placeholders | std::bind 表达式用作参数时,占位符对象被存储于生成的函数对象,而以未绑定参数调用函数对象时,每个占位符 _N 被对应的第 N 个未绑定参数替换。 |
std::bind | 函数模板 bind 生成 f 的转发调用包装器。调用此包装器等价于以一些绑定到 |
#include
#include
#include
#include
void PrintFunc(int x) {
std::cout << x << " ";
}
bool Func(int x) {
return x > 1;
}
int main() {
std::vector<int> v{ 2,0,2,2,0,4,0,1 };
std::vector<int> u;
std::for_each(v.begin(), v.end(), PrintFunc);
std::cout<<std::endl;
//判断v中元素大于1的值复制到u中
std::copy_if(v.begin(), v.end(), std::back_inserter(u), Func);
std::for_each(u.begin(), u.end(), PrintFunc);
}
结果:
2 0 2 2 0 4 0 1
2 2 2 4
例2: 使用std::bind2nd 得到元素大于1的值
(不推荐,在C++17 中移除)
#include
#include
#include
#include
void PrintFunc(int x) {
std::cout << x << " ";
}
int main() {
std::vector<int> v{ 2,0,2,2,0,4,0,1 };
std::vector<int> u;
std::for_each(v.begin(), v.end(), PrintFunc);
std::cout<<std::endl;
//判断v中元素大于1的值复制到u中
std::copy_if(v.begin(), v.end(), std::back_inserter(u),std::bind2nd(std::greater<int>(),1));
std::for_each(u.begin(), u.end(), PrintFunc);
}
结果:
2 0 2 2 0 4 0 1
2 2 2 4
例3: 使用std::bind得到元素大于1的值
#include
#include
#include
#include
void PrintFunc(int x) {
std::cout << x << " ";
}
bool Func(int x,int y) {
return x > y;
}
int main() {
using namespace std::placeholders;
std::vector<int> v{ 2,0,2,2,0,4,0,1 };
std::vector<int> u;
std::for_each(v.begin(), v.end(), PrintFunc);
std::cout<<std::endl;
//判断v中元素大于1的值复制到u中
std::copy_if(v.begin(), v.end(), std::back_inserter(u),std::bind(Func,_1,1));
std::for_each(u.begin(), u.end(), PrintFunc);
}
结果:
2 0 2 2 0 4 0 1
2 2 2 4
例4:std::bind与std::ref使用
#include
#include
bool Func(int x,int y) {
return x > y;
}
void Fun1(int* x) {
++x;
}
auto Fun() {
std::shared_ptr<int> x(new int());
return std::bind(Fun1, &x);
}
void Fun2(int &x) {
++x;
}
int main() {
using namespace std::placeholders;
//简单例子
auto func_x = std::bind(Func,_1,10);
auto func_xy = std::bind(Func,_1,_2);
std::cout <<"x=50,x>10:" << func_x(50)<<std::endl;
std::cout << "x=50 and y=10,x>y:" << func_x(50,10) << std::endl;
//将x拷贝给fun2,实际传入fun2,所以x=0
int x = 0;
auto fun2 = std::bind(Fun2,x);
fun2();
std::cout << "x=" << x << std::endl;
//将x1拷贝给fun3,fun3对象引用x1,所以x=1
int x1 = 0;
auto fun3 = std::bind(Fun2,std::ref(x1));
fun3();
std::cout << "x1=" << x1 << std::endl;
//通过智能指针避免调用可能产生的风险
Fun();
}
结果:
x=50,x>10:1
x=50 and y=10,x>y:1
x=0
x1=1
参考资料:
https://zh.cppreference.com/w/cpp/utility/functional/bind
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)