我有一个模板化成员函数的以下类型签名,它接受一个通用的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);
这可能吗?
答案 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); }