我希望定义一个模板类,其模板参数始终是整数类型。该类将包含两个成员,一个是T
类型,另一个是T
类型的无符号变体 - 即T == int
,然后是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类?或者这是唯一的方法吗?
答案 0 :(得分:22)
答案在<type_traits>
要确定类型的签名,请使用std::is_signed
和std::is_unsigned
。
有关添加/删除签名的信息,有std::make_signed
和std::make_unsigned
。
答案 1 :(得分:3)
如果您不能或不想依赖TR1 / C ++ 0x功能,Boost.TypeTraits也会为您提供make_unsigned<>
等。