C++11 Lambda与仿函数

在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使用了更少的代码来实现相同的功能。

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!