C++ 可以在模板化的typedef上使用模板专门化吗?

C++ 可以在模板化的typedef上使用模板专门化吗?,c++,c++11,c++14,using,template-specialization,C++,C++11,C++14,Using,Template Specialization,我希望执行以下操作(在c++11、c++14中;而不是在c++17中): 模板 使用伙伴=无效; 模板 使用partner=X; 模板 使用partner=Y; 模板 使用partner=Z; 但是我得到了一个编译错误--- 错误:“使用”前应为非限定id ---关于第一个模板专门化 这可能吗?(我已经知道我可以使用带有using语句的模板类。我希望直接使用using语句而不使用类包装器,因为它更简单、更优雅。如果有其他简单、优雅的解决方案,请共享!)您不能专门化别名模板 您将不得不求助于普通

我希望执行以下操作(在c++11、c++14中;而不是在c++17中):

模板
使用伙伴=无效;
模板
使用partner=X;
模板
使用partner=Y;
模板
使用partner=Z;
但是我得到了一个编译错误---

错误:“使用”前应为非限定id

---关于第一个模板专门化


这可能吗?(我已经知道我可以使用带有
using
语句的模板类。我希望直接使用
using
语句而不使用类包装器,因为它更简单、更优雅。如果有其他简单、优雅的解决方案,请共享!)

您不能专门化别名模板

您将不得不求助于普通、枯燥的类模板专门化:

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 struct partner\u t{using type=void;};
模板结构伙伴{using type=X;};
模板结构伙伴{using type=Y;};
模板结构partner_t{using type=Z;};
模板
使用partner=typename partner\u 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;
模板结构标记{using type=T;};
模板自动合作伙伴\u impl(标记)->标记;
自动合作伙伴(标签)->标签;
自动合作伙伴(标签)->标签;
自动合作伙伴(标签)->标签;
模板
使用partner=typename decltype(partner_impl(tag{}))::type;

std::conditional\u t
(with
std::is\u same
)是另一种选择,但我不会说它更优雅。不能这样做的一个原因是别名模板是在上下文中推导的,例如在另一个模板参数中使用时
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;