c ++: принудительная ошибка компиляции, если функция A не вызывается перед функцией B - PullRequest
0 голосов
/ 23 мая 2019

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

Заранее большое спасибо за помощь.

...