1

我想default_deleterstd::unique_ptr。这很容易实现,但是有一个不方便的地方——我必须使用 2 个模板参数而不是一个模板参数来声明变量,如下所示:

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

如您所见,声明很长,我觉得我可以使用较短的版本,但我不知道如何:)

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

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

4

5 回答 5

8

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

template <typename T>
using MyUniquePtr = std::unique_ptr<T, MyDeleter<T>>;
于 2013-06-13T14:45:46.133 回答
3

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

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

MyUniquePtr<MyType>::type var;

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

于 2013-06-13T15:19:14.820 回答
3

您的删除器是否需要根据要删除的对象的类型进行模板化,或者函数调用运算符是否需要根据要删除的对象类型进行模板化就足够了?

代替:

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

你能写吗:

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

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

于 2013-06-13T15:50:24.243 回答
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...) { }
};
于 2013-06-13T15:27:08.747 回答
0

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

于 2013-06-13T17:29:44.900 回答