函数包装器,主要用于模板中函数的使用
#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();
}