И это всё МОЁ

При использовании лямбд и 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, а после вызывать без явного указания типов шаблона?








 ,