代码之家  ›  专栏  ›  技术社区  ›  Blair Holloway

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

  •  18
  • Blair Holloway  · 技术社区  · 15 年前

    我想定义一个模板类,其模板参数将始终是整数类型。类将包含两个成员,其中一个是类型 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 回复  |  直到 15 年前
        1
  •  21
  •   Terry Mahaffey    15 年前

    答案在 <type_traits>

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

    对于添加/删除有符号ness,有std::make_signed和std::make_unsigned

        2
  •  3
  •   Georg Fritzsche    15 年前

    如果你不能或不想依赖于Tr1/C++0x特性, Boost.TypeTraits 也提供给你 make_unsigned<> 等。