【问题标题】:Can one use template specialization on a templated typedef?可以在模板化的 typedef 上使用模板专业化吗?
【发布时间】:2017-09-29 13:27:40
【问题描述】:

我想做类似以下的事情(在 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;

但是我得到一个编译错误---

错误:“使用”之前的预期不合格 ID

---关于第一个模板特化。

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

【问题讨论】:

  • std::conditional_t (with std::is_same) 是另一种选择,但我不会说它更优雅。
  • 你不能做这样的事情的一个原因是别名模板是从上下文中推断出来的,例如如果在另一个模板参数中使用

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


【解决方案1】:

您不能专门化别名模板。

你将不得不求助于普通的、无聊的类模板专业化:

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;

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多