是否可以将std :: unique_ptr子类化为透明地应用自定义删除器?

Thi*_*uda 3 c++ c++11

我有一个调用的类型A,我想创建多个实例,std::unique_ptr<A, void(*)(A *ptr)>而不是每次都显式传递自定义删除器.这就是我想出的:

void ADeleter(A *ptr) {
  // custom deletion logic
}

class APtr : public std::unique_ptr<A, void(*)(A *ptr)> {
  APtr() : APtr(nullptr) {}
  APtr(A *ptr) : std::unique_ptr<A, void(*)(A *ptr)>(ptr, ADeleter) {}
};
Run Code Online (Sandbox Code Playgroud)

std::unique_ptr为了使用自定义删除器抽象构造,继承(或其他智能指针类)是安全的(甚至是一种好的做法)吗?

Cal*_*eth 6

不,std::你应该继承的唯一类有虚拟析构函数.大多数的设计std是模板参数作为扩展点,而不是子类.

你想要的是

struct ADeleter {
    void operator()(A *ptr) {
      // custom deletion logic
    }
};

using APtr = std::unique_ptr<A, ADeleter>;
Run Code Online (Sandbox Code Playgroud)

  • @Ivan:不.`struct ADeleter2 {....}; 使用APtr2 = std :: unique_ptr <A,ADelete2>;` - OP的实现已经使得指针的类型取决于正在使用的删除器. (2认同)