20

テンプレート パラメータが常に整数型になるテンプレート クラスを定義しようとしています。クラスには 2 つのメンバーが含まれます。1 つは typeTで、もう 1 つはタイプの符号なしバリアント (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_signedありstd::make_unsignedます。

于 2010-05-13T04:45:52.887 に答える
3

TR1/C++0x の機能に依存できない、または依存したくない場合は、Boost.TypeTraitsも提供していますmake_unsigned<>

于 2010-05-13T05:06:12.387 に答える