我希望定义一个模板类,其模板参数将始终为整数类型。该类将包含两个成员,一个是 type T
,另一个是 type 的无符号变体T
——即 if T == int
, then T_Unsigned == unsigned int
。我的第一直觉是这样做:
template <typename T> class Range {
typedef unsigned T T_Unsigned; // does not compile
public:
Range(T min, T_Unsigned range);
private:
T m_min;
T_Unsigned m_range;
};
但它不起作用。然后我考虑使用部分模板专业化,如下所示:
template <typename T> struct UnsignedType {}; // deliberately empty
template <> struct UnsignedType<int> {
typedef unsigned int Type;
};
template <typename T> class Range {
typedef UnsignedType<T>::Type T_Unsigned;
/* ... */
};
只要您UnsignedType
对每种整数类型进行部分专业化,这就是有效的。这是一些额外的复制粘贴工作(斜线明智地使用宏),但可以使用。
但是,我现在很好奇 - 是否有另一种方法可以确定整数类型的有符号性和/或使用类型的无符号变体,而不必手动定义每个类型的 Traits 类?或者这是唯一的方法吗?