У меня есть несколько классов, в которых есть функции 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
возвращалась бы константная ссылка?
Вы понимаете, эти const
обрабатываются не во время выполнения, а во время компиляции. Если _lock
- это constexpr
, то можно - через шаблон, например.
Но во время работы программы понятия const
нет. Поэтому максимум, что можно - отреагировать средствами времени выполнения - например, при _lock == true
генерировать исключение при вызове неконстантного метода.
Кстати, а как вы себе представляете, что именно должна делать программа, если вдруг что-то, что было неконстантным, вдруг становится таким? И выполняется действие, которое вдруг стало запрещенным?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Создал onion-сайт, но переменная $_SERVER не отображает ничего полезногоМне кажется, можно как-то получить информацию о цепочке, её IP и т
Подскажите, пожалуйста, как должно выглядеть регулярное выражение для проверки имени пользователя, которое не должно начинаться с цифры...