Khi bạn thấy loại trả về không phải là đối số mẫu hoặc một phần của đối số, do đó bạn không thể quá tải hoặc không chuyên môn. Công văn trên một người trợ giúp là lựa chọn tốt nhất của bạn.
#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); }
Có vẻ hơi lạ khi tôi thực hiện chức năng này bằng tham chiếu rvalue và bạn cũng bỏ qua chuyển tiếp trong ví dụ ban đầu của mình.
Một giải pháp khác có thể là đối số mặc định mẫu và quá tải trên đó. Nhưng điều đó sẽ không hoạt động tốt với danh sách đối số.