C++11 Lambda与仿函数
2023-06-06
9
0
在C++11之彰,我们在使用 STL算法时,通常会用一些特别的对象-仿函数。其本质就是重定义了成员函数operator的一种自定义类型对象。这样的函数有个特点,就是使用在代码层和普通的函数并无两样,但其本质并非相同。
一般情况下,仿函数我们可以写作如下:
class CFactor
{
public:
int operator()(int a, int b)
{
return a + b;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CFactor factor;
int v = factor(1, 2);
return v;
}
在这个例子中,CFactor的operator被重载,因此,在调用该函数时,我们看到跟函数调用一样的形式,只不过factor不是函数名,是一个类的实例-对象名称。
当然相对于普通函数,因为仿函数本质就是一个类对象调用operator()的重载,故类对象在构造时可使用构造函数传递参数来初始化,这样这个仿函数就有了一个初始的状态。
class CMoney
{
public:
CMoney(int p=2) :m_price(p)
{
}
private:
int m_price;
public:
int operator()(int num)
{
return num*m_price;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CMoney money(5);
int v = money(3);
return v;
}
仔细观察话,除过仿函数类的构造函数,发现以上两者的代码很类似,其实这两个仿函数的实现可以很简单地使用lambda来实现。
int _tmain(int argc, _TCHAR* argv[])
{
int price = 5;
auto money = [price](int num)->int{return num*price; };
int v = money(3);
return v;
}
我们可以看到,使用lambda使用了更少的代码来实现相同的功能。