c ++:如果在函数B之前未调用函数A,则强制编译错误

时间:2019-05-23 16:18:41

标签: c++11 compile-time static-assert

我正在设计类Parameter来容纳可以从外部资源(配置文件,服务器,ecc)读取的参数。

我的类不允许在构造函数中设置参数值,但是提供了一个接口,用于分别通过方法SetValueGetValue进行设置和访问。 因此,在创建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来显示错误。

非常感谢您的帮助。

0 个答案:

没有答案