繁体   English   中英

更改std :: unique_ptr的删除器

[英]Changing deleter for std::unique_ptr

我想更改std::unique_ptr default_deleter 这是很容易实现的,但是有一个不便之处-我必须使用2个模板参数而不是一个来声明变量,如下所示:

std::unique_ptr<MyType, MyDeleter<MyType>> myVar;

如您所见,声明很长,我感觉可以使用较短的版本,但是我不知道怎么做:)

是否有可能宣布某种MyUniquePtr<T>这将是相同std::unique_ptr<T, MyDeleter<T>>

编辑:Matthieu M.已经回答,但不幸的是,由于未实现,因此我无法在Visual Studio中使用此功能。 还有其他方式可以产生这种行为吗?

实际上是使用模板别名的:

template <typename T>
using MyUniquePtr = std::unique_ptr<T, MyDeleter<T>>;

如果您的编译器尚未执行模板别名,则为C ++ 03惯用语:

template <typename T>
struct MyUniquePtr {
    typedef std::unique_ptr<T, MyDeleter<T> > type;
};

MyUniquePtr<MyType>::type var;

设置很丑陋,但产生的用法几乎很短:您只需要添加::type

您的删除程序是否需要以要删除的对象的类型为模板,还是足以使函数调用操作符以要删除的对象的类型为模板?

代替:

template<typename T>
struct MyDeleter
{
    void operator()(T* p) const { /* ... */ }
};

你能写吗:

struct MyDeleter
{
    template<typename T>
    void operator()(T* p) const { /* ... */ }
};

当然,这取决于MyDeleter必须保持什么状态。

符合c ++ 03的另一种方法是子类,不幸的是,它需要您重现构造函数。 (如果您的编译器支持可变参数模板参数,则这可以更轻松地完成,当前MSVC可能就是这种情况。)

template <class T>
class MyUniquePtr : public std::unique_ptr< T, MyDeleter<T> > {
public:
    MyUniquePtr(args...) : std::unique_ptr< T, MyDeleter<T> >(args...) { }
};

您可能要考虑编写自己的make_unique样式函数版本,而不是专门用于自定义分配/删除策略。 这还有一个优势,您可以以异常安全的方式执行任何专门的资源获取/分配。 然后,您可以将unique_ptr声明为auto,并让类型推断为您工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM