专注于函子 return 类型

Specialize on functor return type

我有以下模板化成员函数的类型签名,它接受泛型 Functor(无参数)作为其唯一参数,returns 是基于 return 类型的 Container 类型仿函数:

template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
Container<R> spawn(Func call);

我希望为具有 void return 类型的 Functors 创建此函数的专门化,类似于:

template <typename Func,
          typename Traits = funcTraits<Func>,
          typename Traits::resultType == void >
Container<void> spawn(Func call);

这可能吗?

您不能特化函数模板。

但是您可以使用 SFINAE 来设置 return 类型。标准的:

template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
typename std::enable_if<
    !std::is_void<R>::value,
    Container<R>
>::type
spawn(Func call);

还有void一个:

template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
typename std::enable_if<
    std::is_void<R>::value,
    Container<void>
>::type
spawn(Func call);

你不能部分特化一个函数,但你可以使用结构:

namespace detail
{

    template <typename Func, typename Traits, typename R>
    struct impl
    {
        Container<R> operator() (Func call) { /*Default implementation*/ }
    };

    template <typename Func, typename Traits>
    struct impl<Func, Traits, void>
    {
        Container<void> operator() (Func call) { /*specialization*/ }
    };

}


template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
auto spawn(Func call) { return detail::impl<Func, Traits, R>{}(call); }