При использовании лямбд и function в параметре шаблонизированной функции, оно почему то не хочет автоматически выводить тип. Для примера:
template <class T>
void test(const std::function<void(T ii)> &task) {
task(5);
}
...
test<int>([&](int ii) { // так компилит
qDebug() << ii; });
test([&](int ii) { // так не компилит
qDebug() << ii; });
no matching function for call to ‘test(main()::<lambda(int)>)’
candidate: ‘template<class T> void test(const std::function<void(T)>&)’
6 | void test(const std::function<void(T ii)> &task) {
| ^~~~
template argument deduction/substitution failed:
‘main()::<lambda(int)>’ is not derived from ‘const std::function<void(T)>’
Если весь тип function заменить на auto, то компилит (c++20):
void test(const auto &task) {
task(5);
}
Так же при использовании auto не позволяет сделать параметр со значением по умолчанию
void test(const auto& task = nullptr) {
if (task) // error: could not convert ‘task’ from ‘const main()::<lambda(int)>’ to ‘bool’
task(5);
}
Что нужно в шаблоне дописать, что бы все же можно было прописать тип function, а после вызывать без явного указания типов шаблона?