【发布时间】:2020-08-01 15:12:10
【问题描述】:
我正在尝试在使用 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_ptrs?
【问题讨论】:
-
你为什么担心
std::unique_ptr<Tri, UniqueInternalDeleter>?一旦你尝试使用这种类型的变量,你会得到一个编译时错误。 -
@Evg 很遗憾我冲过去了。IDE 没有抱怨,所以我没有编译它。让我换个帖子。
-
为了简化
UniqueInternalDeleter使operator()成为一个接受任何T的模板,并让用户负责提供正确的删除器或使用类似于 JeJo 的答案的static_assert。跨度> -
对于您的口渴编辑/问题更新,我能想到的最简单的方法是,您可以提供一个变量模板来检查允许的类型并在提供的答案中使用
static_assert:template<typename Container> inline constexpr bool hasInternalFreeAllocator = std::is_same_v<T, Foo> || std::is_same_v<T, Bar> || other container....;跨度>
标签: c++ memory-management c++17 smart-pointers unique-ptr