对于模板化的成员函数,我有以下类型的签名,它接受一个泛型函式(无参数)作为它的唯一参数,并根据函子的返回类型返回容器类型:
template <typename Func,
typename Traits = funcTraits<Func>,
typename R = typename Traits::resultType >
Container<R> spawn(Func call);我希望为具有空返回类型的函子创建此函数的专门化,如下所示:
template <typename Func,
typename Traits = funcTraits<Func>,
typename Traits::resultType == void >
Container<void> spawn(Func call);这个是可能的吗?
发布于 2015-07-07 17:03:46
不能专门化函数模板。
但是,可以使用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);发布于 2015-07-07 17:03:47
不能对函数进行部分专门化,但可以使用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); }https://stackoverflow.com/questions/31274881
复制相似问题