为std :: shared_ptr指定一个Deleter,它适用于特定类型的所有对象或其派生类型

saj*_*jas 4 c++ smart-pointers shared-ptr delete-operator c++11

我的项目中有以下课程

class Base
{
    public:
    virtual ~Base(){};
}

class Der1: public Base
{
    public:
    virtual ~Der1(){};
}

class Der2: public Base
{
    public:
    virtual ~Der2(){};
}
Run Code Online (Sandbox Code Playgroud)

我持有这些类的对象为std::shared_ptr.我需要为所有类型Base或任何类型的对象提供自定义删除器derived types.

我想在删除方法中使用的代码将为所有这些对象做同样的事情,比方说

class Deleter
{
    public:
    void operator()( Base * b )
    {
        //Do something
        delete b;
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是在每个对象的构造过程中提供删除器

std::shared_ptr< Der1 > pDer1( new Der1(), Deleter() );
std::shared_ptr< Der2 > pDer2( new Der2(), Deleter() );
Run Code Online (Sandbox Code Playgroud)

有没有办法指定类似"对于所有类型为Base的对象的共享指针或其派生类型Deleter用于删除的东西?由于删除类只是在shared_ptr的构造函数中采用,如何有人为特定类型指定删除器?

Wer*_*mus 7

我在Base中编写了一个创建/工厂函数,返回shared_ptr以获取正确的派生类型.这样的效果:

class Base
{
  //...public...
  template <class Derived>
  static std::shared_ptr<Base> create()
  {
    return std::shared_ptr<Base>(new Derived, Deleter());
  }
};
Run Code Online (Sandbox Code Playgroud)

编辑:功能需要是静态的......

如果派生有多个参数,则可以使用可变参数模板和完美转发来解决.

编辑:

像这样(对于多个参数派生构造函数):

#include <iostream>
#include <memory>

struct Base;

struct Deleter
{
    void operator()(Base* b);
};

struct Base
{
  //...public...
  template <class Derived, class ... Args>
  static std::shared_ptr<Base> create(Args&&... args)
  {
    return std::shared_ptr<Base>(new Derived(std::forward<Args>(args)...), Deleter());
  }
  virtual ~Base(){}
};

void Deleter::operator()(Base* b){ delete b; }


struct Derived : Base
{
  Derived(int a, int b, int c)
  {
  }
};

int main() {
    std::shared_ptr<Base> p = Base::create<Derived>(1,2,3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)