C++中std::bind的使用

C++中std::bind的使用,第1张

bind

早期的 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::placeholdersstd::bind 表达式用作参数时,占位符对象被存储于生成的函数对象,而以未绑定参数调用函数对象时,每个占位符 _N 被对应的第 N 个未绑定参数替换。


std::bind函数模板 bind 生成 f 的转发调用包装器。


调用此包装器等价于以一些绑定到 args 的参数调用 f


例1: 判断v中元素大于1的值复制到u中
#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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/562837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存