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 类型的类型。
我想要一个 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 类型的类型。