Есть ли способ использовать переменную в лямбду, которая не входит в текущую область? - PullRequest
0 голосов
/ 10 сентября 2010

В принципе, я хочу знать, возможно ли что-то подобное ниже?Если это невозможно, есть ли способ подделать это?

#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 ]

1 голос
/ 10 сентября 2010

Вы можете сделать 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;});
}
0 голосов
/ 10 сентября 2010

Звучит так, как будто вы ищете динамическое масштабирование .Это определенно не поддерживается непосредственно C ++ или многими другими языками (единственные языки, о которых я могу думать, которые поддерживают его напрямую, это Perl и Emacs Lisp);для этого есть веские причины, над которыми вы должны медитировать.

Я видел одну реализацию динамической области видимости в C ++, здесь:

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

, которую вы можетебыть в состоянии адаптироваться к вашему использованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...