Подтвердить что ты не робот

Преобразование лямбда-выражения в функцию указателя

Это следующий вопрос к этому вопросу: Лямбда, как я могу пройти как параметр

MSDN предположительно отметил, что элемент зафиксирован. Я взглянул на спецификации, но мне сложно преобразовать их спецификации в синтаксис.

Итак, например:

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

Теперь скажите, что у меня есть лямбда:

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

Что такое синтаксис для преобразования lambda1 в эквивалент функционального указателя, поэтому его можно передать в printOut?

Кроме того, как насчет лямбда, которые на самом деле имеют что-то в скобках? Например:

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

Если этот вид лямбда не может быть преобразован в указатель на функцию, существует ли альтернативный метод передачи этого типа лямбда-выражения в printOut (или даже измененная версия printOut, если да, то какой синтаксис )?

4b9b3361

Ответ 1

Нет синтаксиса как такового, это неявное преобразование. Просто добавьте его (явно или неявно), и вы получите указатель на функцию. Однако это было исправлено после освобождения Visual Studio 2010, поэтому его нет.


Вы не можете сделать захват-полный лямбда в указатель функции когда-либо, как вы отметили, так что функция printOut должна измениться. Вы можете либо обобщить функцию:

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

Или обобщите тип функции в частности:

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

У каждого есть свой компромисс.


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