Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В Qt есть qOverload
https://doc.qt.io/qt-5/qtglobal.html#qOverload
Когда лямбда мономорфная — тут вопросов нет.
Я имею ввиду, что
auto l = [](auto a) { return f(a); }это по сути (gcc 7.3 это успешно компилирует)
auto l = []<typename T>(T a) { return f(a); };Т.е. компилятору нужно выводить тип аргумента a, чтобы определить, нужно этот темплейт инстанциировать для int или для string.
Согласен. Но ведь и при передаче f, нужно так же выводить тип _Fn.
С точки зрения человека, имеющего только самые общие представления о внутреннем устройстве компилятора (т.е. меня), при передаче f вывести тип должно быть даже проще, т.к. у нас сразу же есть всего 2 кандидата:
_Fn == void (*)(int)_Fn == void (*)(string)А при передаче полиморфной лямбды компилятору, получается, нужно рассматривать "двойной" темплейт, т.к. условно говоря, тип нашей лямбды:
_Fn == decltype(l) == template<class TRet, class TArg> TRet (*)(TArg)
Помощь компилятору С++ в разрешении перегрузки функций