C++ 获取不带显式特征的整数模板参数的有符号/无符号变量

C++ 获取不带显式特征的整数模板参数的有符号/无符号变量,c++,templates,unsigned,traits,partial-specialization,C++,Templates,Unsigned,Traits,Partial Specialization,我希望定义一个模板类,其模板参数将始终是整数类型。该类将包含两个成员,一个是T类型,另一个是T类型的无符号变量,即如果T==int,则T\u unsigned==unsigned int。我的第一反应是这样做: template <typename T> class Range { typedef unsigned T T_Unsigned; // does not compile public: Range(T min, T_Unsigned range); pri

我希望定义一个模板类,其模板参数将始终是整数类型。该类将包含两个成员,一个是
T
类型,另一个是
T
类型的无符号变量,即如果
T==int
,则
T\u 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;
};
模板类范围{
typedef unsigned T_unsigned;//不编译
公众:
范围(T最小值,T_无符号范围);
私人:
吴敏;
T_无符号m_范围;
};
但它不起作用。然后我考虑使用部分模板专门化,如下所示:

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;
    /* ... */
};
template struct UnsignedType{};//故意清空
模板结构UnsignedType{
typedef无符号整数类型;
};
模板类范围{
typedef UnsignedType::Type T_Unsigned;
/* ... */
};
只要您对每个整数类型部分地专门化
UnsignedType
,这就行了。这是一点额外的复制粘贴工作(明智地使用宏),但可以使用

然而,我现在很好奇——是否有其他方法可以确定整数类型的有符号性,和/或使用类型的无符号变量,而不必为每个类型手动定义Traits类?或者这是唯一的方法吗?

答案在

要确定类型的有符号性,请使用
std::is_signed
std::is_unsigned


如果您不能或不想依赖TR1/C++0x特性,则有
std::make_signed
std::make_unsigned

,还为您提供了
make_unsigned
等功能。

+1-碰巧我使用的是Visual Studio 2005,它不支持
,因此有一个替代方案非常方便。我仍然接受了
作为答案,因为它是标准库的一部分。@Blair:小心点,这实际上是“将成为”的一部分,它是下一个尚未推出的标准的一部分。