Замена Poco::AutoPtr на boost

Я пытаюсь заменить Poco::AutoPtr какой-то альтернативой в boost. Вот что я обнаружил до сих пор:

Что у меня есть: классы ниже используются с Poco::AutoPtr. Им необходимо реализовать метод подсчета ссылок с реализацией методов duplicate() и release().

Я использую выше referece_counted.h и Poco::AutoPtr в сложной иерархии классов с множественным наследованием и проблемами с бриллиантами С++.

Упрощенная версия классов будет выглядеть примерно так

class A : virtual public ReferenceCounted
{
...
}

class B : public A
{
...
}

class C : public A
{
...
}

class D : public A, B
{
...
}

и этот список можно продолжить еще на несколько уровней. Я знаю, что это нужно отрефакторить с помощью упрощенной иерархии, но я хочу сначала удалить Poco::AutoPtr с правильной заменой в boost:

Что я нашел на данный момент: я обнаружил, что boost::intrusive_ptr — ближайший смарт-указатель, который может стать хорошей заменой Poco::AutoPtr.

Однако я не могу реализовать правильное решение с этим, потому что для intrusive_ptr требуются методы intrusive_ptr_add_ref и intrusive_ptr_release, созданные специально для каждого класса, с которым мне нужно использовать указатель. Я пытался использовать шаблоны, но все еще не имел подходящего решения.

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

intrusive_ptr является правильным умным указателем для этого использования? и если да .. может ли кто-нибудь дать мне предложение относительно того, как использовать то же самое?


person Mital Vora    schedule 23.03.2013    source источник
comment
Привет. Вы нашли решение?   -  person Andrey Volk    schedule 28.09.2013
comment
Нет .. Я получаю сумасшедшие сбои, если пытаюсь изменить .. поэтому на данный момент я скопировал классы poco в свой код и заменил атомарный счетчик. Он отлично работает атм. У меня будет вторая попытка позже.   -  person Mital Vora    schedule 28.09.2013


Ответы (1)


Однако я не могу реализовать правильное решение с этим, потому что для intrusive_ptr требуются методы intrusive_ptr_add_ref и intrusive_ptr_release, созданные специально для каждого класса, с которым мне нужно использовать указатель.

Нет нет. Это не должно быть тяжело. Как сказано в документации Boost:

В компиляторах, поддерживающих поиск в зависимости от аргумента, intrusive_ptr_add_ref и intrusive_ptr_release должны быть определены в пространстве имен, которое соответствует их параметру; в противном случае определения должны идти в расширении пространства имен.

Попробуйте это: main.cpp (построен нормально с "g++ main.cpp -o main -lboost_system")

#include <boost/intrusive_ptr.hpp>  

class MyObject
{
  public:
    void duplicate(){ 
       // ...
    }
    void release(){
       // ...
    }
};

namespace boost {

template <class T>
void intrusive_ptr_add_ref( T * po ) {
    po->duplicate(); // your internal realization
}

template <class T>
void intrusive_ptr_release( T * po ) {
    po->release(); 
}

}        

int main(int argc, char **argv)
{
    // ...
    boost::intrusive_ptr<MyObject> ptr( new MyObject );
    boost::intrusive_ptr<MyObject> ptr2 = ptr; // should work
}
person Andrey Volk    schedule 11.04.2013