有没有办法在lambda中使用不在当前范围内的变量?

时间:2010-09-10 17:28:09

标签: c++ lambda c++11

基本上,我想知道下面的内容是否可行?如果这是不可能的,有没有办法伪造它?

#include <iostream>
using namespace std;

template<typename Functor>
void foo(Functor func)
{
    auto test = [](Functor f){ int i = 5; f(); };
    test(func);
}

int main()
{
    foo([](){ cout << i << endl;});
}

2 个答案:

答案 0 :(得分:1)

你可以让i成为函数的参数。

#include <iostream>
using namespace std;

template<typename Functor>
void foo(Functor func)
{
    auto test = [](Functor f){ f(5); };
    test(func);
}

int main()
{
    foo([](int i){ cout << i << endl;});
}

否则,我认为您必须在可从两个地方访问的范围内声明i,例如作为全局变量:

#include <iostream>
using namespace std;

static int i;    // <--- :(

template<typename Functor>
void foo(Functor func)
{
    auto test = [](Functor f){ i = 5; f(); };
    test(func);
}

int main()
{
    foo([](){ cout << i << endl;});
}

答案 1 :(得分:0)

听起来像你正在寻找的是dynamic scoping。它绝对不是C ++或许多其他语言直接支持的(我能想到的唯一支持它的语言是Perl和Emacs Lisp);有充分的理由你应该冥想。

我在C ++中看到过一个动态范围的实现,在这里:

http://uint32t.blogspot.com/2008/03/lame-implementation-of-dynamic-scoping.html

您可以适应您的使用。