整数値をラップし、この値が常に有効な範囲内にあることを確認する C++ テンプレート クラスを作成しようとしているため、簡略化されたコードは次のようになります。
struct OutOfRangeError
{ };
template<int MIN, int MAX, typename TYPE>
struct IntegerRange
{
private:
TYPE mValue;
public:
IntegerRange(const TYPE value) : mValue(value)
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
operator TYPE() const
{
return mValue;
}
}
前のコードは機能しますが、このクラスを使用する場合に少し欠点があります。以下にサンプルを示します。
typedef IntegerRange<0, 4, int> range1_t;
typedef IntegerRange<0, 5, int> range2_t;
range1_t a = 3;
//range2_t b = a; // This does not work
range2_t b = static_cast<int>(a); // This works OK
したがって、異なる範囲間で値を割り当てるには、指定された TYPE に明示的にキャストする必要があります。この明示的なキャストを回避し、通常の整数であるため IntegerRange クラスを処理することを避けるための解決策が必要です。そのため、開発者は、クラスではなく通常の整数を扱っていると感じるはずです。
これを解決するために、私はさまざまなことを試しました。1 つの作業は、追加のコンストラクターとして次のものです。
template<typename RANGE_TYPE>
IntegerRange(const RANGE_TYPE &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > mValue || mValue > MAX)
{
throw OutOfRangeError();
}
}
ただし、これが機能する場合でも、RANGE_TYPE は TYPE にキャストできる任意の型になる可能性があるため、あまり好きではなく、これを IntegerRange クラスのみに制限したいと考えています。IntegerRange クラスのみに制限するために、次のことを試しましたが、コンパイルされておらず、理由がわかりません。
template<int ARG_MIN, int ARG_MAX, typename ARG_TYPE>
IntegerRange(const IntegerRange<ARG_MIN, ARG_MAX, typename ARG_TYPE> &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
質問は 2 です:
* コードの最後の部分がコンパイルされない理由と、それをコンパイルするために何を変更する必要があるか。
* 行方不明の明示的なキャストを避けるほうがよい方法はありますか?
ありがとう