C++函数包装器与引用包装器,函数绑定器的使用

函数包装器,主要用于模板中函数的使用

#include <iostream>
#include<functional>

using namespace std;

template<class T , class F>
T testRun(T t1,T t2,F func){
	return func(t1, t2);
}

int add(int a ,int b){
	return a + b;
}

float addFloat(float a, float b){
	return a + b;
}


void main(){

	//返回值 参数
	function<int(int, int)> fun1 = add;
	function<float(float, float)> fun2 = addFloat;

	//cout << fun1(10,20)<<endl;
	//cout << fun2(20.2,12.2)<<endl;

	cout << testRun < float, function < float(float, float) >> (10.2, 10.3, fun2) << endl;

	cout << testRun<int,function<int(int,int)>>(10,30,fun1) << endl;

	cout << "Nanjing" << endl;

	cin.get();
}



引用包装器用于模板识别出引用,将其作为引用使用,不是副本机制

/*
引用包装器
一般使用在模块中,因为模板一般是不会使用引用的,所以这时可以使用引
引用包装器进行引用。
*/
#include <iostream>

using namespace std;

template<typename T>
void shaotest(T t){
	t += 9;
}

template<typename T>
void shaotest22(T& t){
	t += 9;
}

void main(){

	int data = 10;
	int &rdata(data);

	shaotest22(rdata);
	cout << data << endl;

	shaotest(ref(data));
	cout << data << endl;
	//引用包装器 让模板识别为引用  
	shaotest(ref(rdata));
	cout << "引用包装器:" << data << endl;

	cin.get();
}

函数绑定器使用语法如下:

#include <iostream>
#include <functional>

using namespace std;
using namespace std::placeholders;


struct Teacher{

  void add(int a){
    cout << a << endl;
  }

  void add2(int a,int b){
    cout<<a<<b<<endl;
  }

}; 


int testFun(int a,int b){
 return a+b;
}


void main(){
  
   Teacher teacher;
   cout<<typeid(&Teacher::add).name()<<endl;



   void(Teacher::*p)(int) = &Teacher::add;   //p是函数指针
  
  //函数绑定器
   auto fun = bind(&Teacher::add,&teacher,_1);  //_1代表有1个参数
   fun(2222);


   auto fun2 = bind(&Teacher::add2,&teacher,_1,_2); //占位符两个代表两个参数
   fun2(100,300);

   auto fun3 = bind(testFun,12,_1);
   cout<<"result:"<<fun3(100)<<endl;

   //函数绑定lambada
   auto fun4 = bind([](int a,int b)->int{return a + b;},109,_1);
   cout <<"lambada result:" << fun4(2) << endl;

   cout<<"Shaozhongqi"<<endl;
   cin.get();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值