あなたは
template<typename T, T MinRange_, T MaxRange_>
struct RangeRestrictedValue {
T value;
RangeRestrictedValue(const char* paramName_ = nullptr)
: value(doRangeCheck(T())), paramName(paramName_) {}
RangeRestrictedValue(const T& value_, const char* paramName_ = nullptr)
: value(doRangeCheck(value_)), paramName(paramName_) {}
RangeRestrictedValue& operator=(const T& value_) {
value = doRangeCheck(value_);
return *this;
}
static T& doRangeCheck(const T& value) {
std::ostringstream message;
message << (paramName ? paramName : "value") << " is out of range.";
if(value < MinRange_ || value > MaxRange_) {
throw std::out_of_range(message.str().c_str());
}
}
const char* paramName;
};
そして
class Galaxy {
private:
typedef RangeRestrictedValue<double,MIN_GALAXY_MASS,MAX_GALAXY_MASS> GalaxyMass;
GalaxyMass mass;
public:
Galaxy(double mass_) : mass(mass_,"mass") {}
double mass() const { return mass.value; }
void mass(double mass_) { mass = mass_; }
void doSomething() {
// access mass.value as you need to
}
};
のように、私は100%わからないんだけど、あり得ることを使用のチェックを容易にするために、単純なラッパークラスを使用して、入力チェックを簡素化することができます[ユーザー定義リテラル](http://en.cppreference.com/w/cpp/language/user_literal)は、あなたのケースで役立つ可能性があります。だから、基本的には、コンパイル時に適用できる値の監視範囲を特定したいのですか?より簡潔なサンプルを提供する必要があります。コードをどのように見せるか –
標準のC++で有効な範囲を宣言する方法はありません。最も一般的な方法は、入力をテストし、範囲外の場合はエラーを返すことです。このケースではコンストラクタでは使用しないことをお勧めしますが、カプセル化を使用してこれを行うアクセサとミューテータを作成することがあります https://en.wikipedia.org/wiki/Encapsulation_(computer_programming) – Ben
クラスのコンストラクタで範囲を調べるか、またはそのコンストラクタの範囲をチェックする 'GalaxyMass'というクラスを作成します。 – rlbond