Обратите внимание, что шаблон функции представляет собой семейство функций. Когда вы, скажем, передаете его функции, которую необходимо разрешить для определенной специализации шаблона. Я понимаю, что вы пытаетесь сделать с параметром вашего пользовательского invoke
(захватить шаблон функции как шаблон), но, к сожалению, это будет работать только с шаблонами классов, но не шаблонами функций.
Тебе нужен другой уровень косвенности. А именно, передавая функтор или лямбду, которые пересылают аргументы в f
:
invoke([](auto&&... xs) { f(decltype(xs)(xs)...); }, 1, 2, 3);
Разница в том, что теперь аргумент является не шаблонным классом, поэтому он может быть выведен вашим invoke
.
Это изменение сопровождается дополнительным требованием, чтобы вы изменили свою функцию, чтобы полностью вывести первый параметр:
template<class F, class... Args>
void invoke(F&& f, Args&&... args) {
f(forward<Args>(args)...);
}