类模板std::function 是⼀个通⽤的多态函数包装器。当做函数指针。
1. 函数对象定义
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。
2. 函数对象的好处
(1)函数对象有自己的状态,即它可以携带自己的成员函数,而且这个函数对象在多次调用的过程中它的那些状态是共享的,而函数则不能做到这点(除非定义函数内部的静态变量或者全局变量)。
(2)函数对象有自己的类型,而普通函数则没有。在使用STL的容器时可以将函数对象的类型传递给容器作为参数来实例化相应的模板,从而来定制自己的算法,如排序算法。
function类模板
template< class R, class... Args >
class function< R (Args...)>
说明:R是被调⽤函数的返回类型 Args....是被调⽤的函数的形参。function是类模板,只有成员函数,没有数据成员。
1. 调用普通函数
#include <functional>
#include <iostream>
using namespace std;
int f(int a, int b)
{
return a+b;
}
int main()
{
std::function<int(int, int)>func = f;
cout<<func(1, 2)<<endl; // 3
system("pause");
return 0;
}
说明:模板类必须实例化使⽤,上⾯实例化后对象名 func,对象func可以指向的函数是有两个int参数,返回值是int的函数,函数f满⾜。调⽤也只需func(1,2 )实现调⽤。
2. 调⽤函数对象
#include <iostream>
using namespace std;
//function object
struct functor
{
public:
int operator() (int a, int b)
{
return a + b;
}
};
int main()
{
functor ft;
function<int(int,int)> func = ft;
cout<<func(1,2)<<endl; //3
return 0;
}
3. 调⽤模板函数对象
#include <iostream>
using namespace std;
//function object
template<typename T>
struct functor
{
public:
T operator() (T a, T b)
{
return a + b;
}
};
int main()
{
functorT<int> ft;
function<int(int, int)> func = ft;
cout << func(1, 2) << endl; //3
return 0;
}