しかし、コンテナーがテンプレート パラメーターから指定されたアロケーターを内部的に再バインドする場合、コンテナーが使用するアロケーターの種類を知るにはどうすればよいでしょうか?
Allocator<T>
コンストラクターには常に anを指定します (コンテナーのT
the はどこにありますか)。コンテナは、コンテナの内部データ構造が必要な場所value_type
にそれを変換します。このような変換コンストラクターを提供するには、次のように指定する必要があります。Allocator<U>
U
Allocator
template <class T> class allocator {
...
template <class U> allocator(const allocator<U>&);
さらに、C++ 11 はスコープ付きアロケーターを使用するようになったことを読みました。これにより、コンテナーを含むコンテナーのアロケーターを再利用できます。
より正確に言うと、C++11 にはと呼ばれるアロケータ アダプタscoped_allocator_adaptor
があります。
template <class OuterAlloc, class... InnerAllocs>
class scoped_allocator_adaptor : public OuterAlloc
{
...
};
C++11 から:
クラス テンプレートscoped_allocator_adaptor
は、コンテナーによって使用されるメモリ リソース (外部アロケーター) を指定する (他のアロケーターと同様に) アロケーター テンプレートであり、コンテナー内のすべての要素のコンストラクターに渡される内部アロケーター リソースも指定します。このアダプタは、1 つの外部アロケータ タイプと 0 個以上の内部アロケータ タイプでインスタンス化されます。1 つのアロケータ タイプのみでインスタンス化された場合、内部アロケータは
scoped_allocator_adaptor
したがって、コンテナーとコンテナー内のすべての要素に同じアロケーター リソースを使用し、要素自体がコンテナーの場合は、それらの各要素を再帰的に使用します。複数のアロケーターでインスタンス化された場合、最初のアロケーターはコンテナーが使用する外部アロケーターであり、2 番目のアロケーターはコンテナーの要素のコンストラクターに渡され、要素自体がコンテナーである場合は、3 番目のアロケーターがコンテナーに渡されます。要素の要素など。コンテナーがアロケーターの数を超える深さまでネストされている場合、単一アロケーターの場合と同様に、残りの再帰に対して最後のアロケーターが繰り返し使用されます。[注:scoped_allocator_adaptor
外部アロケーター型から派生しているため、ほとんどの式で外部アロケーター型を置き換えることができます。—エンドノート]
したがって、コンテナーのアロケーターとして a を指定した場合にのみ、スコープ指定されたアロケーターの動作が得られscoped_allocator_adaptor
ます。
スコープ付きアロケーター対応コンテナーの実装は、スコープ付きコンテナーを認識しない実装とはどのように異なりますか?
allocator_traits
重要なのは、コンテナーがアロケーターを直接処理するのではなく、呼び出された新しいクラスを介してアロケーターを処理するようになったことです。また、コンテナは、コンテナ内の s の構築や破棄などの特定の操作に使用する必要があります。コンテナーは、アロケーターと直接対話してはなりません。allocator_traits
value_type
たとえば、アロケーターはconstruct
、指定された引数を使用して特定のアドレスで型を構築するというメンバーを提供できます。
template <class T> class Allocator {
...
template<class U, class... Args>
void construct(U* p, Args&&... args);
};
アロケーターがこのメンバーを提供しない場合、allocator_traits
デフォルトの実装が提供されます。いずれにせよ、コンテナはこの関数を使用してすべての を構築する必要がありますが、 を介して使用し、を直接使用するのではありません。value_type
construct
allocator_traits
allocator
allocator_traits<allocator_type>::construct(the_allocator, *ugly details*);
は、トレイトを利用して正しいアロケーターをコンストラクターに渡すscoped_allocator_adaptor
カスタムconstruct
関数を提供します。コンテナは、これらの詳細を幸いなことに知らないままです。コンテナーは、関数を使用して を構築する必要があることだけを認識しておく必要があります。allocator_traits
uses_allocator
value_type
value_type
allocator_traits construct
ステートフル アロケータを正しく処理するために、コンテナが対処しなければならない詳細がさらにあります。これらの詳細も、コンテナーに仮定を行わず、 を介してすべてのプロパティと動作を取得させることで処理されますallocator_traits
。pointer
コンテナはそれがであると想定することさえできませんT*
。むしろ、このタイプは、それが何であるかを尋ねることによって見つかりallocator_traits
ます。
つまり、C++11 コンテナーを構築するには、 を調べてallocator_traits
ください。そして、クライアントがscoped_allocator_adaptor
.