gpt4 book ai didi

c++ - 如何安全地重载 std::unique_ptr 的自定义删除器?

转载 作者:行者123 更新时间:2023-12-01 14:37:08 25 4
gpt4 key购买 nike

我试图在使用 std::unique_ptr 时减少代码重复它是自定义删除器。
我有一些容器 Foo , Bar使用一个自定义分配器分配,因此无法使用 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_ptr年代?

最佳答案

您可以制作 UniqueInternalDeleter作为模板仿函数和 static_assert , 如果 T不是 Foobar .

#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*`

}
};
这使您的别名对 Bar 更加具体。和 Foo :
using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter<Bar>>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter<Foo>>;

关于c++ - 如何安全地重载 std::unique_ptr 的自定义删除器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63206760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com