我正在尝试减少使用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
s?
您可以将UniqueInternalDeleter
as用作模板函子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*`
}
};
这使您的别名更加针对Bar
和Foo
:
using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter<Bar>>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter<Foo>>;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句