Общие, слабые и ленивые указатели на С++
Кто-нибудь знает о реализации shared_ptr
и weak_ptr
вместе с ленивым партнером по инициализации? Требованиями классов были:
-
A lazy_ptr
класс, который позволяет клиенту построить объект позже (если вообще), без необходимости реализации конструктора
-
A weak_lazy_ptr
класс, который имеет три возможных состояния: еще не сконструирован (не будет привязан к shared_ptr
), сконструирован (будет заблокирован до shared_ptr
) и уничтожен (не будет блокироваться a shared_ptr
)
Я создал несколько классов, которые совсем недавно не выполняли работу (см. статью CVu здесь), в которой использовались shared_ptr
и weak_ptr
в их реализации. Основные проблемы с моделью, в которой используются общие и слабые указатели USES, а не интеграция с ними:
-
Как только все объекты lazy_ptr
выходят из области видимости, любые слабые ссылки больше не могут быть заблокированы, даже если другие клиенты держат shared_ptr
версии
-
Невозможно управлять конструкцией объектов на разных потоках.
Я был бы признателен за любые указания на другие попытки согласования этих проблем или с любой текущей работой, которая может быть в этой области.
Ответы
Ответ 1
Чтобы создать отложенную конструкцию, которая не требует параметров:
boost::bind( boost::factory<T*>(), param1, param2 )
создаст объект функции, который выполняет эквивалент new T(param1, param2)
, не требуя параметров во время построения.
Чтобы создать shared_ptr, который поддерживает эту отложенную конструкцию:
Свяжите свой factory со стандартным boost::shared_ptr
(например, в классе вашего творения), и вы передадите результаты, которые вы описываете, включая соответствующие функциональные возможности weak_ptr
...
Какой бы код не запускал отложенную конструкцию, которую должен выполнить клиент:
your_shared_ptr.reset( your_factory() );
Какой бы код не запускал объект уничтожение:
your_shared_ptr.reset();
Общий указатель будет evauluate до true
только во время жизни объекта. И если вы хотите, чтобы вы отличали "еще не построенный" от "уничтоженного", вы можете установить bool после запуска factory.