Класс обертка для управления константностью объекта

214
15 июля 2022, 21:30

У меня есть несколько классов, в которых есть функции lock() и unlock(), которые управляют переменной класса bool lock. Если lock == true, то объект становится константным - можно читать данные из класса, а попытка изменить объект вызывает ошибку времени выполнения.

Хочу обобщить данный механизм - написать класс обертку, который аналогично управлял бы хранящемся в нем объектом. Что-то вроде такого:

template <typename T>
class locking_type
{
public:
    locking_type() : _value(T{}), _lock(false) {};
    ~locking_type() {};
    void lock() { _lock = true; }
    void unlock() { _lock = false; }
    // if _lock
    //const T& operator()() { return _value; }
    T& operator()() { return _value; }
    operator T() const { return _value; }
private:
    T _value;
    bool _lock;
};

Возможно ли сделать так, чтобы если _lock = false возвращалась обычная ссылка на хранящийся объект, а если _lock = true возвращалась бы константная ссылка?

Answer 1

Вы понимаете, эти const обрабатываются не во время выполнения, а во время компиляции. Если _lock - это constexpr, то можно - через шаблон, например.

Но во время работы программы понятия const нет. Поэтому максимум, что можно - отреагировать средствами времени выполнения - например, при _lock == true генерировать исключение при вызове неконстантного метода.

Кстати, а как вы себе представляете, что именно должна делать программа, если вдруг что-то, что было неконстантным, вдруг становится таким? И выполняется действие, которое вдруг стало запрещенным?

READ ALSO
Ошибки C2440 / E0513 [дубликат]

Ошибки C2440 / E0513 [дубликат]

Учу С++Дошел до классов

196
Есть ли конструктор у базовых типов?

Есть ли конструктор у базовых типов?

Есть ли конструктор у базовых типов, например int?

229
Как получить больше данных на onion-сайте в TOR?

Как получить больше данных на onion-сайте в TOR?

Создал onion-сайт, но переменная $_SERVER не отображает ничего полезногоМне кажется, можно как-то получить информацию о цепочке, её IP и т

206
Регулярное выражение для валидации имени пользователя

Регулярное выражение для валидации имени пользователя

Подскажите, пожалуйста, как должно выглядеть регулярное выражение для проверки имени пользователя, которое не должно начинаться с цифры...

217