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

Bla*_*way 19 c++ unsigned templates partial-specialization traits

我想定义一个模板类,其模板参数将始终是一个整数类型.该类将包含两个成员,一个是类型,另一个是类型T的无符号变体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;
};
Run Code Online (Sandbox Code Playgroud)

但它不起作用.然后我考虑使用部分模板专业化,如下所示:

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;
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

只要您UnsignedType每个整数类型进行部分专门化,这都可以.这是一些额外的复制粘贴工作(削减明智地使用宏),但可以使用.

但是,我现在很好奇 - 有没有另一种方法可以确定整数类型的signed-ness,和/或使用类型的无符号变体,而不必手动定义每类型的Traits类?或者这是唯一的方法吗?

Ter*_*fey 22

答案是在 <type_traits>

要确定类型的signed-ness,请使用std :: is_signed和std :: is_unsigned

对于添加/删除signed-ness,有std :: make_signed和std :: make_unsigned