C ++ lambdas如何/可以保留内部状态?

时间:2016-06-26 10:37:55

标签: c++ lambda

我有一个基本的lambda,如下所示:

auto l = [](){
  int i = 0;
  cout << i++;
}

多次打电话,将继续打印0.如何保留我?我可以不用仿函数吗?

4 个答案:

答案 0 :(得分:14)

根据您对此lambda的处理方式,您可以考虑以下替代方法:

[]() { static int i = 0; cout << ++i << ' '; };

使用1 2 3 4代替将导致打印序列heroku run scrapy crawl spider

Live example

答案 1 :(得分:13)

尝试将lambda视为具有#include <iostream> auto l = [i=0]()mutable{ std::cout << i++; }; auto l2=l; int main(){ l(); // 0 l(); // 1 l(); // 2 l2(); // 0 l2(); // 1 l(); // 3 std::cout << '\n'; } 的类。你如何在课堂上保留国家?有一个成员。捕获与此相当。

   $(document).ready(function() {

    //some even that will run ajax request - for example click on a button

    var uname = $('#username').val();
    $.ajax({
    type: 'POST',
    url: 'func.php', //this should be url to your PHP file
    dataType: 'html',
    data: {func: 'toptable', user_id: uname},
    beforeSend: function() {
        $('#right').html('checking');
    },
    complete: function() {},
    success: function(html) {
        $('#right').html(html);
    }
    });

    });
And your func.php:

  function toptable()
 {
  echo 'something happens in here';
 }

答案 2 :(得分:5)

 auto l = [](){
   static int i = 0;
// ^^^^^^
   cout << i++;
 }

应该解决您的问题。

通常,在不使用本地static变量的情况下,函数不能保留内部状态。实际上使用lambdas没有区别。

如果要计算副本,可以使用普通的仿函数类实现@Revolver_Ocelot suggested

答案 3 :(得分:2)

如果您希望i保留其值,则有三个选项:

  1. i声明为全局变量(错误)。
  2. 每次都将i的前一个值传递给函数(更好)。
  3. i声明为static变量(最佳)。

    auto l = []() { static int i = 0; cout << i++ << endl; };
    l(); l(); l();
    

    这将作为输出:

    0
    1
    2