C++函式包裝器與引用包裝器,函式繫結器的使用
阿新 • • 發佈:2019-01-11
函式包裝器,主要用於模板中函式的使用
引用包裝器用於模板識別出引用,將其作為引用使用,不是副本機制#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(); }