如您所见,返回类型不是模板参数或参数的一部分,因此您不能重载或专门化。派遣助手是您的最佳选择。
#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); }
不过,通过右值引用来获取函数对我来说似乎有点奇怪,而且您在原始示例中也省略了转发。
另一种可能的解决方案可能是模板默认参数和重载。但这不适用于参数列表。