目录
前言:
C++11的包装器,总称为function包装器,而包装器又称适配器,顾名思义包装器主要是用于包装函数的,实际上是将函数指针、仿函数类、lambda函数进行了又一层的封装。
1、包装器的用法
包装器的具体结构如下:
使用包装器需包头文件:<functional>
// 类模板原型如下
template <class Ret, class... Args>
class function<Ret(Args...)>;
模板参数说明:
Ret: 被调用函数的返回类型
Args…:可变参数包,表示被调用函数的形参可以有多个
包装器测试代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<functional>
using namespace std;
int f(int a, int b)
{
cout << "int f(int a, int b)" << endl;
return a + b;
}
int main()
{
function<int(int, int)> f1 = f;//包装函数f
cout << f1(1, 2) << endl;//使用包装器调用函数f
return 0;
}
运行结果:
从结果可以看到,若要使用包装器封装函数,则包装器的返回类型和参数必须和该函数一致,示意图如下:
并且包装器仅仅只是封装了函数f,并且生成一个包装器对象,用包装器对象去调用包装的函数时,还是会去调用函数f的本体。
2、包装器的类型
函数指针,lambda函数、仿函数类这三种函数本身是不能够直接进行赋值操作的,因为他们三个各有各的类型,然而经过包装器包装后,产生的三个包装器对象是可以直接进行相互赋值操作的。
示例代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<functional>
using namespace std;
int f(int a, int b)
{
cout << "int f(int a, int b)" << endl;
return a + b;
}
struct Functor
{
public:
int operator() (int a, int b)
{
cout << "int operator() (int a, int b)