typedef 的部分特化

Partial specialization of typedef

我想要一个 typedef 或 class 类型。因此,像这样的东西

template< typename T > class A { };
template< typename T > using X< T, true > = T;
template< typename T > using X< T, false > = A< T >;

显然,这不会编译。

为了克服这个问题,我“发明”了以下结构,在我看来它似乎相当复杂:

template< typename T > class A { }; 

template< typename T, bool E > struct make_X;

template< typename T >
struct make_X< T, true > {
    T make();
};

template< typename T >
struct make_X< T, false > {
    A< T > make();
};

template< typename T, bool E > using X = decltype( make_X<T,E>::make() );

有没有更简单的方法来实现我的目标?

通常,人们会这样做:

template< typename T, bool E > using X = std::conditional_t<E, T, A<T>>;

这里唯一的问题是,如果您想在仅提及 A<T> 格式不正确的情况下使用类型 X<T, true>。在那种情况下 X<T, true> 将是错误的,即使结果不是 A<T> 也是如此。如果这是一种可能的情况,那么更复杂的东西,比如你写的,可能是合适的,以确保 A<T> 一开始就不会被提及。但是,一般来说,这将在部分特化中使用类型别名(例如 using type = T;)而不是通过函数来​​完成,以防 T 或 [=12] =] 是某种不允许作为函数 return 类型的类型。