专注于仿函数返回类型

时间:2015-07-07 16:57:01

标签: c++ templates specialization

我有一个模板化成员函数的以下类型签名,它接受一个通用的Functor(无参数)作为其唯一参数,并根据函数的返回类型返回一个Container类型:

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

我希望为具有void返回类型的Functors创建此函数的特化,类似于:

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

这可能吗?

2 个答案:

答案 0 :(得分:2)

您不能专门化功能模板。

但是,您可以使用SFINAE设置返回类型。标准的:

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);

答案 1 :(得分:1)

你不能部分专门化一个函数,但你可以使用struct:

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); }