テンプレート パラメータが常に整数型になるテンプレート クラスを定義しようとしています。クラスには 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 クラスを手動で定義することなく、整数型の符号付きを決定したり、型の符号なしバリアントを使用したりする別の方法はありますか? それとも、これが唯一の方法ですか?