1. 程式人生 > >C++函式包裝器與引用包裝器,函式繫結器的使用

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();
}