Подтвердить что ты не робот

Общие, слабые и ленивые указатели на С++

Кто-нибудь знает о реализации 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 версии

  • Невозможно управлять конструкцией объектов на разных потоках.

Я был бы признателен за любые указания на другие попытки согласования этих проблем или с любой текущей работой, которая может быть в этой области.

4b9b3361

Ответ 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.