Можно вывести тип лямбда-выражения, если он является аргументом для параметра функции шаблона функции, тип которого выводится.
Лямбда-выражения, однако, явно запрещены для появления внутри неоцененного операнда - включая decltype
. Было обнаружено, что это включает в себя несколько еще не обработанных особых случаев, и было обнаружено, что нет реальной утилиты, позволяющей использовать лямбда-выражения внутри decltype
и друзей. Напомним, что каждое лямбда-выражение создает новый уникальный тип.
Вместо этого вы можете использовать std::function<void()>
, который может хранить любой объект функции, который может быть вызван без аргументов, и возвращает void
в качестве возвращаемого типа.
Foo< std::function<void()> > foo([](){ cout<<"construct OK"; });
Конечно, как я уже говорил выше, шаблоны функций могут определять тип аргумента, поэтому вы также можете сделать конструктор шаблоном
class Foo
{
public:
template<typename T>
Foo(T t){ t(); }
};
Foo foo([](){ cout<<"construct OK"; });
Но я полагаю, что это не очень полезно в вашем случае, так как вы, вероятно, хотите что-то сделать с T
в вашем определении класса. Например, хранение объекта как нестатического члена данных. С std::function
это возможно.