Come si vede il tipo restituito non è un argomento modello o parte degli argomenti, quindi non è possibile sovraccaricare né specializzarsi. L'invio di un aiuto è la tua migliore opzione.
#include <type_traits>
template<typename Func, typename... Args>
void func_impl(Func&& f, Args&&... args, std::true_type)
-> decltype(func_impl(std::forward<Args>(args)...))
{ }
template<typename Func, typename... Args>
void func_impl(Func&& f, Args&&... args, std::false_type)
-> decltype(func_impl(std::forward<Args>(args)...))
{ }
template<typename Func, typename... Args>
auto func(Func&& f, Args&&... args)
-> decltype(func_impl(std::forward<Func>(f), std::forward<Args>(args)...))
{ return func_impl(std::forward<Func>(f), std::forward<Args>(args)...,
std::is_pointer<decltype(f(std::forward<Args>(args)...))>::type); }
sembra un po 'strano per me a prendere la funzione di riferimento rvalue e anche se si omette anche l'inoltro nel tuo esempio originale.
Un'altra possibile soluzione potrebbe essere un argomento predefinito di modello e sovraccarico su quello. Ma questo non funzionerebbe bene con la lista degli argomenti.