В книге Скотта Майерса - "Наиболее эффективное использование C++" в правиле 29 приводится реализация группы классов для обслуживания пользовательского класса Widget посредством создания класса-обертки RCWidget, содержащего указатель RCIPtr<Widget> и перенаправляющие функции. Этот механизм соответствует современному std::shared_ptr за исключением того, что в механизме Майерса имеется возможность при изменении данных по указателю отделить его от остальных и создать копию данных, т.е. значение разделяется до тех пор, пока его изменят в одном из указателей - тогда создается дополнительная копия.
Вопрос в том, является ли эта реализация приемлемой на современном стандарте C++ и, если нет, то в чем ее следует дорабатывать? Есть реализация такого надстроечного механизма в boost или еще где-то?
P.S. Код не приложил, просто под рукой только книга и телефон, а он на 2.5 стр. Если у кого-нибудь есть электронная версия - дополните, пожалуйста.
Дать однозначный ответ нельзя.
С одной стороны, более распространённым является intrusive-подход, когда объект сам управляет разделением своих данных (и, соответственно, хранит в себе указатель на внутренний контейнер с ними). Это обосновывается инкапсуляцией и отсутствием лишних сущностей.
С другой же стороны, любой intrusive нарушает принцип «один класс — одна сущность», смешивая воедино основную функцию и диспетчер управления данными. К тому же, он обязывает программиста к постоянному использованию данного механизма, даже когда он избыточен.
Так что приемлемость того или иного подхода зависит от конкретной ситуации. Где-то применимы классы-обёртки, где-то — внутреннее управление силами самого объекта.
Это называется copy-on-write.
Примерно такого же можно добиться с std::shared_ptr<const T>.
При модификации объекта его надо явно копировать, например
auto s = make_shared<const string>("foo");
auto s2 = s;
auto s3 = make_shared<const string>(*s + "bar");
auto s4 = make_shared<string>(*s);
s4->resize(4);
shared_ptr<const string> s5 = s4;
Если на объект указывают только shared_ptr<const T>, то бонусом идет потокобезопасность - объект никогда не поменяется.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости