为 std::shared_ptr 指定一个适用于特定类型或其派生类型的所有对象的删除器

Specifying a Deleter for std::shared_ptr that works on all objects of a particular type or its derived types

我的项目中有以下 classes

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

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

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

我持有这些 classes 的对象为 std::shared_ptr。我需要为 Base 类型或其任何 derived types.

类型的所有对象提供自定义删除器

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

class Deleter
{
    public:
    void operator()( Base * b )
    {
        //Do something
        delete b;
    }
}

而不是像

那样在每个对象的构造过程中提供删除器
std::shared_ptr< Der1 > pDer1( new Der1(), Deleter() );
std::shared_ptr< Der2 > pDer2( new Der2(), Deleter() );

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

我会在 Base 中编写一个 creation/factory 函数,为正确的派生类型返回 shared_ptr。达到这个效果的东西:

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

编辑:函数需要是静态的...

如果derived有多个参数,可以通过可变参数模板和完美转发来解决。

编辑:

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

#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;
}