c ++'保留状态'是什么意思?

时间:2012-07-04 06:49:42

标签: c++ lambda functional-programming state

我在MSDN页面上阅读了这个解释,了解lambda表达式优于functor和函数指针的优点。 “保留国家”的能力是什么意思?它是否与通过参考或值封闭范围捕获某些变量的能力有关?

http://msdn.microsoft.com/en-us/library/dd293608.aspx

  

编写代码时,您可能使用函数指针和函数   解决问题和执行计算的对象。两个功能   指针和函数对象有优点和缺点:   函数指针涉及最小的语法开销,但它们没有   保留范围内的国家;函数对象可以维护状态,但是   它们需要类定义的语法开销。

     

Lambda表达式是一种结合了   函数指针和函数对象的好处,并避免   他们的缺点。 Lambda表达式非常灵活且可以维护   state,就像函数对象一样,并且它们的紧凑语法会被删除   需要一个类定义,函数对象需要。   Lambda表达式使您能够编写不那么繁琐的代码   并且比等效的函数对象更不容易出错。

     

以下示例比较了lambda表达式的使用   使用函数对象。第一个示例使用lambda表达式   打印到控制台是否为矢量对象中的每个元素   偶数或奇数。第二个示例使用函数对象来完成   同样的任务。

你能指出一些关于主题范围,状态,维护状态,lambda表达式优势的相关参考吗?

谢谢和问候

1 个答案:

答案 0 :(得分:8)

Functors和lambdas都具有超越正常功能的能力。它是在函数调用之间记住东西的能力。普通函数具有静态变量,但它们是全局唯一的,如果您希望单独的函数对象具有自己的唯一状态,那么这是不好的。这是一个示例仿函数类:

class Counter
{
    int n;
public:
    Counter() :n(0) {}
    int operator()() { return n++; }    
};

通过这个类,我可以创建一个充当函数的实例,每次调用它时,它都会记住先前的n值,例如

Counter x;
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';

使用普通功能无法做到这一点。但你可以用lambdas做到这一点:

int n = 0;
auto x = [=]() mutable { return n++; };
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';