使用中のコードの重複を減らしようとしていますstd::unique_ptr
。これはカスタムの削除ツールです。
1つのカスタムアロケーターを使用して割り当てられているいくつかのコンテナー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>;
を介して割り当てられた任意の数のコンテナをs internal_free
として使用できるようにするにはどうすればよいstd::unique_ptr
ですか?
あなたは作ることができるUniqueInternalDeleter
ようにテンプレートファンクタをして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]
コメントを追加