如何安全地重载std :: unique_ptr的自定义删除程序?

Ankii:

我正在尝试减少使用std::unique_ptr时的代码重复,它是自定义删除器。

我有一些容器FooBar它们是使用一个自定义分配器分配的,因此无法使用释放delete

因此,当前代码为:

struct UniqueFooDeleter
{
   void operator()(Foo* foo) 
   {
      internal_free(foo);
   }
};
using unique_foo_ptr = std::unique_ptr<Foo, UniqueFooDeleter>;

struct UniqueBarDeleter 
{
   void operator()(Bar* bar) 
   {
      internal_free(bar);
   }
};
using unique_bar_ptr = std::unique_ptr<Bar, UniqueBarDeleter>;

我将其更改为:

struct UniqueInternalDeleter
{
   void operator()(Bar* bar)
   {
      internal_free(bar);
   }

   void operator()(Foo* foo)
   {
      internal_free(foo);
   }
};
using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter>;

我如何做得更好,以便可以将通过分配的任意数量的容器internal_free用作std::unique_ptrs?

杰乔:

您可以将UniqueInternalDeleteras用作模板函子static_assert,如果T不是Foo或则可以bar

#include <type_traits> // std::is_same_v

template<typename T>
struct UniqueInternalDeleter /* final */
{
   static_assert(std::is_same_v<T, Foo> || std::is_same_v<T, Bar>,
      " T must be either Foo or Bar");

   void operator()(T* barOrfoo)
   {
      internal_free(barOrfoo);
   }

private:
   void internal_free(T* barOrfoo)
   {
      if constexpr(std::is_same_v<T, Foo>)
         // code for `Foo*`
      else
         // code for `Bar*`

   }
};

这使您的别名更加针对BarFoo

using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter<Bar>>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter<Foo>>;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有lambda自定义删除程序的std :: unique_ptr无法编译

可以将std :: unique_ptr子类化以透明地应用自定义删除程序吗?

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

具有自定义删除程序的std :: shared_ptr的Typedef别名

如何正确使用自定义shared_ptr删除程序?

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

使用std :: function对象将自定义删除器传递给std :: unique_ptr

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

使用typedef为std :: unique_ptr指定自定义默认删除器

std :: unique_ptr <T []>和自定义分配器删除器

未调用std :: unique_ptr中的自定义删除器

std :: unique_ptr使用带有很少参数的自定义删除器

std :: unique_ptr,自定义删除器和类型更改

如何制作unique_ptr和自定义删除器的副本

如何使用lambda和功能作为unique_ptr的自定义删除器

如何为由 unique_ptr 管理的数组编写自定义删除器?

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

如何将自定义删除器与std :: unique_ptr成员一起使用?

使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

防止不安全地取消引用std :: unique_ptr

如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

C ++ 11:使用自定义Lambda Deleter返回std :: unique_ptr

std :: unique_ptr与自定义自由操作结合使用

如何安全地将unique_ptr与可以返回NULL的函数一起使用?

unique_ptr删除程序的开销

Anaconda:如何安全地删除重复的软件包

如何安全地编码基于参数的目录删除?