我想做类似以下的事情(在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
语句,因为它更简单,更多如果有另一个简单,优雅的解决方案,请分享!)
答案 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;