C ++: передача лямбды как функции с аргументами шаблона приводит к ошибкам определения типов шаблонов - PullRequest
1 голос
/ 16 января 2020

Использование типа шаблона в параметрах функции, передаваемой в качестве аргумента (либо в виде std :: function, либо в качестве указателя на функцию), делает компилятор неспособным определить тип, когда функция передается как лямбда (см. Код ниже) , Интересно, что это работает, если функция не является лямбда.

Есть ли способ добиться этого? Я пробовал следующий код с Visual Studio 2017 и G CC 7.4, и оба не удаются, поэтому вряд ли это будет ошибка компилятора и, вероятно, есть причина для такого поведения.

#include <iostream>
#include <functional>

template <typename T>
void collide(void (*callback)(T)) // or std::function<void(T)> callback
{
    callback(42);
}

int main() {
    // doesn't compile: "could not deduce template arguments"
    collide([](int a) {
        std::cout << a << std::endl;
    });
}

1 Ответ

3 голосов
/ 16 января 2020

Попробуйте использовать следующий вызов

collide( *[](int a) {
    std::cout << a << std::endl;
});

для явного преобразования лямбды в указатель на функцию.

Вот демонстрационная программа.

#include <iostream>

template <typename T>
void f( void ( *fn )( T ) )
{
    fn( 42 );
}

void g( int x )
{
    std::cout << "g( " << x << " );\n";
}

int main()
{
    f( g );
    f( *[]( int x ) { std::cout << "main::lambda( " << x << ");\n"; } );
}

Его выход составляет

g( 42 );
main::lambda( 42);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...