【发布时间】:2018-04-13 17:23:46
【问题描述】:
我有一个名为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) {}
};
从std::unique_ptr(或其他智能指针类)继承以使用自定义删除器抽象构造是否安全(甚至是一种好习惯)?
【问题讨论】:
-
它没有回答你的问题,但我已经使用的是自定义默认删除器:
namespace std { template<> class default_delete<A> { public: void operator()(A *p) { ADeleter(p); } }; } -
@werner 双重检查标准;模板的特化不得违反对自身标准的保证。
-
@WernerHenze 在
std之外定义删除器并使用它提供别名会更安全 -
另一种(我认为更好的)方法是编写一个函数来创建一个适当的
std::unique_ptr类型的对象。这可以是一个接受A*的简单函数,也可以是构造A对象的更复杂的模板函数(类似于std::make_unique)。