20

我希望定义一个模板类,其模板参数将始终为整数类型。该类将包含两个成员,一个是 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 类?或者这是唯一的方法吗?

4

2 回答 2

24

答案在<type_traits>

为了确定类型的符号性,请使用std::is_signedstd::is_unsigned

对于添加/删除签名,有std::make_signedstd::make_unsigned

于 2010-05-13T04:45:52.887 回答
3

如果您不能或不想依赖 TR1/C++0x 功能,Boost.TypeTraits还为您提供make_unsigned<>等。

于 2010-05-13T05:06:12.387 回答