Как я могу локально переопределить boost :: shared_ptr? - PullRequest
1 голос
/ 26 января 2012

У меня есть класс с функцией void deallocatorFunc(ClassA *p). Я хочу использовать шаблоны, чтобы можно было писать boost::shared_ptr< ClassA > ptr(new ClassA()); вместо boost::shared_ptr< ClassA > ptr(new ClassA(), deallocatorFunc);. Я хочу, чтобы это распространилось на мой класс и его наследников. Как это сделать в C ++? (Мне действительно нужен мой особенный деструктор для этого специального класса, хотя я хочу сохранить супер простой API).

Ответы [ 2 ]

1 голос
/ 26 января 2012

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

#include <iostream>
#include <boost/shared_ptr.hpp>

using namespace std;

class A
{
   public:
   A() {
      cout << "Constructing A." << endl;
   };
   virtual ~A() {
      cout << "Destructing A." << endl;
   }
};

class B : public A
{
   public:
   B() {
      cout << "Constructing B." << endl;
   };
   virtual ~B() {
      cout << "Destructing B." << endl;
   }
};
class C
{
   public:
   C() {
      cout << "Constructing C." << endl;
   };
   virtual ~C() {
      cout << "Destructing C." << endl;
   }
};

void deallocatorFunc(A *p)
{
   cout << "Deallocator function." << endl;
   delete p;
};

namespace boost {
    template<> class shared_ptr<A> {
       private:
       shared_ptr<void> _ptr;
       public:
       shared_ptr(A* p) : _ptr(p, deallocatorFunc)
       {
       }
    };
}
int main( int argc, const char* argv[] )
{
   boost::shared_ptr<A> ptrA(new A());
   boost::shared_ptr<B> ptrB(new B());
   boost::shared_ptr<C> ptrC(new C());
}

Вывод:

Построение A. Построение A. Построение B. Построение C. Разрушение C. РазрушениеB. Разрушение функции A. Deallocator.Уничтожение A.

Примечание

Как указано, специализация не работает для производных классов A!

Чтобы это работало, вам нужно больше хитрости:

Шаблон специализации на основе наследуемого класса

0 голосов
/ 26 января 2012
namespace boost {
    template<typename myclass> class shared_ptr {
    };
}

Приятного вам переопределения boost :: shared_ptr. Все, что включает в себя вышеуказанный код в заголовке, получит ваш shared_ptr вместо буста.

Имейте в виду, что это не будет совместимо с кодом, который включает в себя повышение сам по себе !!!

...