目录
一、function包装器
1.1 可调用对象
我们平时使用的普通函数、函数指针、仿函数和Lambda表达式都是可调用对象,它们不仅可以作为其他函数的参数传入,还可以作为其他函数的返回值
虽然这些可调用对象的使用方法基本都差不多,但其定义方式大有不同,例如:
void swap(int& a, int& b) //普通函数
{
int tmp = a;
a = b;
b = tmp;
}
void(*swap_p)(int&, int&) = swap; //函数指针
class Swap
{
public:
void operator()(int& a, int& b) //仿函数
{
int tmp = a;
a = b;
b = tmp;
}
};
auto lam_swap = [](int& a, int& b)-> void { //Lambda表达式
int tmp = a;
a = b;
b = tmp;
};
这就导致我们在对这些不同的函数包装器进行保存的时候无法以统一的方式保存
例如:
假设一个函数模板的参数需要我们传入一个可调用对象,当我们传入不同的可调用对象时,这个函数也会被实例化多次,例如:
template<class F>
int tem_func(F f)
{
static int count = 0;
cout << "count=" << ++count << endl; //打印count的值
cout << "&count=" << &count << endl; //打印count的地址
return f();
}
int func()
{
return 1;
}
class Func
{
public:
int operator(