可以在模板化的typedef上使用模板特化吗?

时间:2017-09-29 13:27:40

标签: c++ c++11 c++14 using template-specialization

我想做类似以下的事情(在c ++ 11,c ++ 14;而不是c ++ 17):

template <class T>
using partner = void;

template<>
using partner<A> = X;

template<>
using partner<B> = Y;

template<>
using partner<C> = Z;

但是我收到了编译错误---

  

错误:在'using'

之前预期的nonqualified-id

---关于第一个模板专业化。

这样的事情可能吗? (我已经知道我可以使用带有using语句的模板化类。我希望在没有类包装器的情况下直接使用using语句,因为它更简单,更多如果有另一个简单,优雅的解决方案,请分享!)

1 个答案:

答案 0 :(得分:10)

您无法专门化别名模板。

你将不得不诉诸正常,无聊的课程模板专业化:

template <class T> struct partner_t { using type = void; };
template <> struct partner_t<A> { using type = X; };
template <> struct partner_t<B> { using type = Y; };
template <> struct partner_t<C> { using type = Z; };

template <class T>
using partner = typename partner_t<T>::type;

或者我们可以变得更加漂亮

template <class T> struct tag { using type = T; };

template <class T> auto partner_impl(tag<T> ) -> tag<void>;
auto partner_impl(tag<A> ) -> tag<X>;
auto partner_impl(tag<B> ) -> tag<Y>;
auto partner_impl(tag<C> ) -> tag<Z>;

template <class T>
using partner = typename decltype(partner_impl(tag<T>{}))::type;