tags:

views:

68

answers:

2

Basically, I want to know if something like the below is possible? If this isn't possible is there any way to fake it?

#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;});
}
A: 

It kind of sounds like what you are looking for is dynamic scoping. It's definitely not directly supported by C++ or many other languages (the only languages I can think of that do support it directly are Perl and Emacs Lisp); there are good reasons for this which you should meditate on.

I've seen one implementation of dynamic scoping in C++, here:

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

which you may be able to adapt to your use.

Jack Lloyd
+1  A: 

You could make i an argument to the function.

#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;});
}

Otherwise, I think you have to declare i in a scope that is accessible from both places, e.g. as a global variable:

#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;});
}
KennyTM