一、仿函数的运用
使用仿函数时需要引入头文件
#include functional
普通函数
int Func01(int a, int b)
{
return a + b;
}
std::function<int(int, int)> Func1 = Func01;
int ret = Func1(1, 2);
cout << ret << endl;
Lambda
auto la = [](int a, int b)->int
{
return a + b;
};
std::function<int(int, int)> Func2 = la;
int ret2 = Func2(1, 2);
cout << ret2 << endl;
函数指针
int(*Ptr)(int, int);
Ptr = Func01;
std::function<int(int, int)> Func3 = Ptr;
int ret3 = Func3(1, 2);
cout << ret3 << endl;
成员函数
class FTestClass
{
public:
int Func04(int a, int b)
{
return a + b;
}
};
FTestClass Tc;
std::function<int(int, int)> Func4 = bind(&FTestClass::Func04, &Tc, placeholders::_1, placeholders::_2);
int ret4 = Func4(1, 2);
cout << ret4 << endl;
使用类重写括号
class FTestClass02
{
public:
int operator()(int a, int b)
{
return a + b;
}
};
std::function<int(int, int)> Func5 = FTestClass02();
int ret5 = Func5(1, 2);
cout << ret5 << endl;
静态函数
class FTestClass03
{
public:
static int Func06(int a, int b)
{
return a + b;
}
};
std::function<int(int, int)> Func6 = FTestClass03::Func06;
int ret6 = Func6(1, 2);
cout << ret6 << endl;
模板函数
template<typename T>
T Func07(T a, T b)
{
return a + b;
}
std::function<int(int, int)> Func7 = Func07<int>;
int ret7 = Func7(1, 2);
cout << ret7 << endl;
实际使用案例
void CallBack(std::function<int(int, int)> func)
{
cout << "Hello" << endl;
cout << func(1, 2) << endl;
cout << "world" << endl;
}
CallBack([](int a, int b)->int
{
return a + b;
});
二、Bind
int Func01(int a, int b)
{
return a + b;
}
template<typename T>
T Func02(T t1, T t2)
{
return t1 + t2;
}
class FTestClass
{
public:
int Func03(int a, int b)
{
return a + b;
}
};
1.延时
auto F1 = std::bind(Func01, 1, 2);
std::cout << F1(3, 4) << std::endl;
2.占位
auto F2 = std::bind(Func01, std::placeholders::_1,std::placeholders::_2);
std::cout << F2(3, 4) << std::endl;
3.模板函数绑定
auto F3 = std::bind(Func02<int>, 1, 2);
std::cout << F3() << std::endl;
4.类的成员函数
FTestClass tc;
auto F4 = std::bind(&FTestClass::Func03,&tc, 1, 2);
std::cout << F4() << std::endl;