Пакет параметров конечного шаблона всегда оставляет место для дальнейшего вывода.Указание первых двух аргументов не мешает вам делать что-то вроде этого:
std::function<void(int, double, char)> fce3 ;
TestFunction<int, double>(fce3);
В этом случае пакет будет содержать int, double, char
, потому что символ был выведен из аргумента функции.Теперь, поскольку дедукция не закончена, а лямбда не является std :: function, подстановка завершается неудачно.
Чтобы это работало, вам нужно дать знать процессу дедукции, что инстанцированная функциятребуется сейчас , прежде чем будет дан аргумент.Один из способов сделать это - взять адрес функции, например:
auto pfunc = TestFunction<int, double>;
pfunc(fce);
или
(&TestFunction<int, double>)(fce);
Получение адреса шаблона функции - это еще один контекст, в котором может происходить вывод аргумента шаблона.В этом случае конечный пакет выводится как пустой, и вы получаете указатель на функцию, которую вы можете вызвать.