Function (pointer) is not a std::function, so doesn't work for deduction.
You might make Ts... non deducible in that context
template<typename T, typename ... Args> void foo(std::function<void(T, std::type_identity_t<Args>...)> fcn, Args ... args) { // Some code that calls fcn } or drop std::function completely
template<typename T, typename F, typename ... Args> requires (std::is_invocable<F, T, Args...>::value) void foo(F fcn, Args&& ... args) { // Some code that calls fcn }