我有一个名为void deallocatorFunc(ClassA *p)
的函数的类我希望使用模板可以编写boost::shared_ptr< ClassA > ptr(new ClassA());
而不是boost::shared_ptr< ClassA > ptr(new ClassA(), deallocatorFunc);
。我希望它传播到我的班级及其继承者。如何在C ++中做这样的事情? (我真的需要我那个特殊类的特殊析构函数,而我想保留超级简单的API)。
答案 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!
的派生类为了实现这一点,你需要更多的技巧:
答案 1 :(得分:0)
namespace boost {
template<typename myclass> class shared_ptr {
};
}
享受您对boost :: shared_ptr的重新定义。在标题中包含上述代码的任何内容都会获得您的 shared_ptr
而不是提升。
请注意,这与自行包含提升功能的代码不兼容!!!