Вы можете использовать специализацию для своего класса и обернуть стандартную реализацию.Вот автономный компилируемый пример.
#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!
Чтобы это работало, вам нужно больше хитрости:
Шаблон специализации на основе наследуемого класса