我怎样才能在本地重新定义boost :: shared_ptr?

时间:2012-01-26 00:39:41

标签: c++ templates pointers boost typedef

我有一个名为void deallocatorFunc(ClassA *p)的函数的类我希望使用模板可以编写boost::shared_ptr< ClassA > ptr(new ClassA());而不是boost::shared_ptr< ClassA > ptr(new ClassA(), deallocatorFunc);。我希望它传播到我的班级及其继承者。如何在C ++中做这样的事情? (我真的需要我那个特殊类的特殊析构函数,而我想保留超级简单的API)。

2 个答案:

答案 0 :(得分:1)

您可以为您的类使用专门化并包装标准实现。这是一个独立的可编辑示例。

#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!

的派生类

为了实现这一点,你需要更多的技巧:

Template specialization based on inherit class

答案 1 :(得分:0)

namespace boost {
    template<typename myclass> class shared_ptr {
    };
}

享受您对boost :: shared_ptr的重新定义。在标题中包含上述代码的任何内容都会获得您的 shared_ptr而不是提升。

请注意,这与自行包含提升功能的代码不兼容!!!