23

This is a follow up question to this question: Lambda how can I pass as a parameter

MSDN supposedly has marked the item as fixed. I took a look at the specifications, but I'm having trouble converting their specifications into what the syntax should be.

So for example:

void printOut(int(*eval)(int))
{
    for(int x = 0; x < 4; ++x)
    {
        std::cout << eval(x) << std::endl;
    }
}

Now say I have the lambda:

auto lambda1 = [](int x)->int{return x;};

What is the syntax to convert lambda1 into the functional pointer equivalent so it can be passed to printOut?

Also, what about lambdas which actually have something in the brackets? For example:

int y = 5;
auto lambda2 = [y](void)->int{return y;};

If this kind of lambda can't be converted to a function pointer, is there an alternative method for passing this type of lambda expression to printOut (or even a modified version of printOut, if so what's the syntax)?

3
  • "MSDN supposedly has marked the item as fixed." The Connect bug says that "This issue has been fixed and will be available in future releases." It doesn't say that the fix is available for the current release of the compiler. Commented May 2, 2011 at 4:28
  • oh. I guess me being naive supposed that sp1 would have included this fix :P Commented May 2, 2011 at 5:29
  • Oh; apologies, I didn't see what the date was on the Connect bug (which is funny, I suppose, since I reported it). It probably didn't meet the bar to make it into the service pack then. Commented May 2, 2011 at 14:28

1 Answer 1

17

There is no syntax per se, it's an implicit conversion. Simply cast it (explicitly or implicitly) and you'll get your function pointer. However, this was fixed after Visual Studio 2010 was released, so is not present.


You cannot make a capture-full lambda into a function pointer ever, as you noted, so it's the function printOut that'll have to change. You can either generalize the function itself:

// anything callable
template <typename Func>
void printOut(Func eval) 
{
    // ...
}

Or generalize the function type in particular:

// any function-like thing that fits the int(int) requirement
void printOut(std::function<int(int)> eval) 
{
    // ...
}

Each has their own trade-off.


†As far as I know, it's unknown of we'll get it in a service pack, or if we need to wait until a new release.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.