更改std :: unique_ptr的删除

时间:2013-06-13 14:43:46

标签: c++ c++11

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

std::unique_ptr

正如您可能看到声明很长,我觉得我可以使用更短的版本,但我不知道如何:)

是否可以声明某种与std::unique_ptr<MyType, MyDeleter<MyType>> myVar; 相同的MyUniquePtr<T>

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

如果你的编译器还没有模板别名,这里是C ++ 03习语:

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

MyUniquePtr<MyType>::type var;

设置较为简单,但最终的使用情况几乎一样短:您只需要添加::type

答案 2 :(得分:3)

您的删除器是否需要对要删除的对象的类型进行模板化,或者是否足以使函数调用运算符对要删除的对象的类型进行模板化处理?

而不是:

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

你能写下:

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

当然,这取决于MyDeleter必须维持的状态。

答案 3 :(得分:0)

符合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...) { }
};

答案 4 :(得分:0)

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