考虑:
template <typename Function, typename ...Args>
auto wrapper(Function&& f, Args&&... args) -> decltype(f(args...)) {
//...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在所有decltype(f(args...))指针的情况下部分专门化上述模板?
编辑:
我认为它可以使用模板助手类来完成,该类decltype(f(args...))作为模板参数,并专门化助手类.如果你知道更好的解决方案,请告诉我.
基于 SFINAE 的解决方案:
#include <type_traits>
template<
typename Functor
, typename... Args
, typename Result = decltype(std::declval<Functor&>()(std::declval<Args>()...))
, typename std::enable_if<
std::is_pointer<Result>::value
, int
>::type = 0
>
Result wrapper(Functor&& functor, Args&&... args)
{ /* ... */ }
template<
typename Functor
, typename... Args
, typename Result = decltype(std::declval<Functor&>()(std::declval<Args>()...))
, typename std::enable_if<
!std::is_pointer<Result>::value
, int
>::type = 0
>
Result wrapper(Functor&& functor, Args&&... args)
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)
您可以根据您的需要调整测试(此处为std::is_pointer<Result>)。