Лямбда это не std::function
. Его можно преобразовать в std::function
, но в вашем шаблоне вы сопоставляете mytype
с обоими параметрами.
Это означает, что параметры должны иметь возможность выполнять точное совпадение без какого-либо преобразования обоих аргументов. для правильного соответствия шаблона.
Вы могли бы явно указать тип, чтобы он работал
print<int>(9999, myLamba);
Однако лучше не использовать std::function
, просто Может быть отдельным параметром шаблона. Таким образом может быть передан любой вызываемый тип, и в качестве бонуса вы избежите накладных расходов на его стирание в std::function
.
template <typename mytype, typename Func>
void print(mytype arg1, Func arg2)
{
arg2(arg1);
}
auto myLamba = [](int x){std::cout << "x = " << x << std::endl;};
print (9999, myLamba); // Now this works