获取没有显式特征的整数模板参数的有符号/无符号变体

时间:2010-05-13 04:35:42

标签: c++ templates unsigned traits partial-specialization

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

2 个答案:

答案 0 :(得分:22)

答案在<type_traits>

要确定类型的签名,请使用std::is_signedstd::is_unsigned

有关添加/删除签名的信息,有std::make_signedstd::make_unsigned

答案 1 :(得分:3)

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