Преобразование лямбда-выражения в указатель на функцию - PullRequest
22 голосов
/ 02 мая 2011

Это дополнительный вопрос к этому вопросу: Лямбда, как я могу передать в качестве параметра

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, если так, каков синтаксис )

1 Ответ

17 голосов
/ 02 мая 2011

Сам по себе синтаксис отсутствует, это неявное преобразование. Просто приведите его (явно или неявно), и вы получите указатель на свою функцию. Однако это было исправлено после выпуска 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) 
{
    // ...
}

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


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

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