Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在本地重新定义boost::shared\u ptr?_C++_Templates_Pointers_Boost_Typedef - Fatal编程技术网

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资源。您正在演示显式专门化,而不是部分专门化。您正在演示显式专门化,而不是部分专门化。您是否可以为您的类型重载
运算符删除
?您是否可以为您的类型重载
运算符删除