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

用户名

我正在处理与new_free_方法相关联的C类型

的类型签名new_可能有所不同,但是free_始终为void free_something(something*);

目前,我正在unique_ptr以这种方式声明自己的,这似乎过于冗长:

std::unique_ptr<qdr_link_t, decltype(&free_qdr_link_t)> link{new_qdr_link_t(), free_qdr_link_t};

我能以更少的仪式做到这一点吗?std::free()https://stackoverflow.com/a/43626234/1047788上当我的deallocator是函数时,我看到了一种巧妙的解决方案我试图创建一个可以参数化deallocator的版本,但是却无所适从。

我能想到的最好的办法就是从上述声明中创建一个宏。

带翅膀的小行星

让语言来努力!

#include <memory>

struct qdr_link_t;
qdr_link_t* new_qdr_link_t();
void free_qdr_link_t(qdr_link_t*);

template <typename T, typename Deleter>
auto make_unique_ptr(T* raw, Deleter deleter)
{
    return std::unique_ptr<T, Deleter>(raw, deleter);
}

//std::unique_ptr<qdr_link_t, decltype(&free_qdr_link_t)> link{new_qdr_link_t(), free_qdr_link_t};
auto link = make_unique_ptr(new_qdr_link_t(), free_qdr_link_t);

增加std::forward口味(如果您在乎)。


对于C ++ 11,您需要将尾随的返回类型添加-> std::unique_ptr<T, Deleter>到中make_unique_ptr,或仅将其放入“正常”返回类型中。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

使用自定义删除器在地图中存储unique_ptr

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

与unique_ptr结合使用

get()不会破坏std :: unique_ptr背后的想法吗?

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

混淆使用unique_ptr和自定义删除器

std :: unique_ptr是RAII的应用程序吗?

将具有自定义删除器的unique_ptr移到shared_ptr

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

使用带有unique_ptr的自定义删除器

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

我可以将函数的输出参数存储到unique_ptr吗?

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

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

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

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

在std容器中使用unique_ptr有透明的方法吗?

可以将std :: unique_ptr视为monad吗?

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

当使用“新”来初始化unique_ptr <FILE *,File :: Close>时,自定义删除器负责释放该内存吗?

我们可以使用lambda创建unique_ptr吗?

删除函数unique_ptr

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

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

这是使用unique_ptr的正确方法吗?

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

unique_ptr 的有状态自定义删除器

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