C++ 如何在本地重新定义boost::shared\u ptr?
我有一个名为C++ 如何在本地重新定义boost::shared\u ptr?,c++,templates,pointers,boost,typedef,C++,Templates,Pointers,Boost,Typedef,我有一个名为void deallocatorFunc(ClassA*p)的类,我希望使用模板可以编写boost::shared_ptrptr(new ClassA())而不是boost::shared_ptrptr(新的ClassA(),deallocatorFunc)。我希望它传播到我的类及其继承者。如何在C++中做这些事情?(我真的需要这个特殊类的特殊析构函数,同时我想保留超级简单的API)。名称空间boost{ 模板类共享\u ptr{ }; } 享受您对boost::shared\u
void deallocatorFunc(ClassA*p)
的类,我希望使用模板可以编写boost::shared_ptrptr(new ClassA())
而不是boost::shared_ptrptr(新的ClassA(),deallocatorFunc)代码>。我希望它传播到我的类及其继承者。如何在C++中做这些事情?(我真的需要这个特殊类的特殊析构函数,同时我想保留超级简单的API)。名称空间boost{
模板类共享\u ptr{
};
}
享受您对boost::shared\u ptr的重新定义。任何在标题中包含上述代码的内容都将获得您的共享\u ptr
,而不是boost
请记住,这将与包含boost的代码不兼容名称空间提升{
模板类共享\u ptr{
};
}
享受您对boost::shared\u ptr的重新定义。任何在标题中包含上述代码的内容都将获得您的共享\u ptr
,而不是boost
请记住,这将与包含boost的代码不兼容您可以为类使用专门化,并包装标准实现。下面是一个自包含的可编译示例
#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());
}
#包括
#包括
使用名称空间std;
甲级
{
公众:
(){
cout您可以对类使用专门化并包装标准实现
#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());
}
#包括
#包括
使用名称空间std;
甲级
{
公众:
(){
有没有可能只为一种类类型重载/专门化boost shared_ptr创建,使其与包含boost的代码兼容?@myWallJSON:没有,但您可以将构造函数设置为私有,并强制人们使用工厂函数在freestore上分配对象(工厂函数将使用正确的语义)。@ildjarn:当然有可能,他只需要覆盖shared\u ptr
的一个模板专门化并复制其余部分。如果你认为这是真的,那么你应该详细说明。我不认为这是真的,但我不知道你的意思“覆盖shared_ptr
的一个模板专门化,并复制其余部分”,因为这对我来说没有多大意义。(以及如何避免违反ODR?@ildjarn:ODR适用于模板实例化,而不是模板声明。您可能有一个模板,其中”如果参数为MyClass
,请使用此版本,否则请使用通用的“一网打尽”“。将其视为一个随机的非web资源。是否有可能只为一个类类型重载/专门化boost共享\u ptr创建,以使其与包含boost的代码兼容?@myWallJSON:否,但您可以将构造函数设为私有,并强制人们使用工厂函数在freestore上分配对象(工厂函数将使用正确的语义)。@ildjarn:当然有可能,他只需要覆盖shared\u ptr
的一个模板专门化并复制其余部分。如果你认为这是真的,那么你应该详细说明。我不认为这是真的,但我不知道你的意思“覆盖shared_ptr
的一个模板专门化,并复制其余部分”,因为这对我来说没有多大意义。(以及如何避免违反ODR?@ildjarn:ODR适用于模板实例化,而不是模板声明。您可能有一个模板,其中”如果参数为MyClass
,请使用此版本,否则请使用通用的“一网打尽”“。将其视为随机的非web资源。您正在演示显式专门化,而不是部分专门化。您正在演示显式专门化,而不是部分专门化。您是否可以为您的类型重载运算符删除
?您是否可以为您的类型重载运算符删除
?