Я разрабатываю класс 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
для отображения ошибки.
Заранее большое спасибо за помощь.