模板的部分特化

Mar*_*tin 6 c++ templates

考虑:

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...))作为模板参数,并专门化助手类.如果你知道更好的解决方案,请告诉我.

Luc*_*ton 3

基于 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>)。