我正在设计类Parameter
来容纳可以从外部资源(配置文件,服务器,ecc)读取的参数。
我的类不允许在构造函数中设置参数值,但是提供了一个接口,用于分别通过方法SetValue
和GetValue
进行设置和访问。
因此,在创建Parameter
对象与对该对象调用方法SetValue
之间,参数处于“未定义”状态。
我想防止类的用户访问未定义的参数值。
例如,实现此目标的一种方法是使用boost::optional
并在调用设置函数之前尝试访问该值时引发错误:
class Parameter{
public:
void SetValue(double val){ value_ = val; }
double GetValue() const {
if(!value_)
// raise an error
return *value_;
}
private:
boost::optional<double> value_;
};
这样,我们可以实现以下行为:
Parameter a;
a.SetValue();
a.GetValue(); // ok
Parameter a1;
a1.GetValue(); // runtime error, a1 is undefined
现在,当值未定义时,我想在编译时引发错误。 我已经考虑过修改界面的选项,并允许用户在构造函数中设置值,而不能在其他地方设置(以便参数始终处于一致状态),但是它实际上并不能很好地适应我的其余设计。
所以我想知道是否有办法实现这样的目标:
Parameter a;
a.SetValue();
a.GetValue(); // compiles and run
// Parameter a1;
// a1.GetValue(); // does not compile
也许还使用static_assert
来显示错误。
非常感谢您的帮助。