しかし、どのように私はそれ が内部テンプレートパラメータから与えられたアロケータを再バインドした場合、コンテナは、使用するアロケータの種類を知っているのですか?
常に(T
が容器のvalue_type
ある)コンストラクタにAllocator<T>
を供給する。コンテナはそれをAllocator<U>
に変換する必要があります。ここで、U
はコンテナの内部データ構造です。Allocator
は、例えば、そのような変換コンストラクタを供給する必要がある:
template <class T> class allocator {
...
template <class U> allocator(const allocator<U>&);
さらに私はC++ 11は現在 が含む容器のための容器のアロケータを再利用することを可能にするスコープアロケータを使用していることを読み取ります。
まあ、より正確には、C++ 11がscoped_allocator_adaptor
と呼ばれるアロケータアダプタあり:C++ 11から
template <class OuterAlloc, class... InnerAllocs>
class scoped_allocator_adaptor : public OuterAlloc
{
...
};
を:
クラステンプレートscoped_allocator_adaptor
があります コンテナによって使用されるメモリリソース(外部アロケータ)を指定するアロケータテンプレート (他のアロケータと同様)コンテナ内のすべての要素 のコンストラクタに渡されるアロケータリソースを内部の として指定します。このアダプタは、1つの外部と0以上の内部アロケータ型の でインスタンス化されます。 アロケータ型の1つだけでインスタンス化された場合、内部アロケータは scoped_allocator_adaptor
となり、コンテナ内およびコンテナ内のすべての要素に対して同じアロケータ リソースを使用し、要素自体がコンテナである場合は その要素は再帰的に です。複数のアロケータでインスタンス化した場合、最初の アロケータは容器で使用するために外側の割当である、第二 アロケータは、コンテナの要素のコンストラクタに渡さ と、要素自体がコンテナである場合、第三のアロケータはです が要素の要素に渡されます。容器はアロケータの数よりも大きい深さまで を入れ子になっている場合、最後アロケータ が残っ 再帰ため、単一アロケータの場合のように、繰り返し使用されます。 【注:それはほとんどの式で外側アロケータ タイプに置換することができるようにscoped_allocator_adaptor
を 外側アロケータ型に由来します。 - エンドノート]
あなたのコンテナのアロケータとしてscoped_allocator_adaptor
を指定するのであれば、あなたは唯一のスコープアロケータの動作を取得。
スコープ付きアロケータ対応コンテナ の実装は、スコープ付きコンテナを認識しないものとどのように異なるのですか?
キーは、アロケータを直接処理するのではなく、allocator_traits
という新しいクラスを使用してアロケータを処理することが重要です。 は、コンテナにvalue_type
を作成して破棄するなどの特定の操作には、allocator_traits
を使用する必要があります()。 のコンテナは、はアロケータに直接話してはいけません。例えば、アロケータが部材を提供することができる
は、与えられた引数を使用して特定のアドレスにタイプを構築することconstruct
呼ば:
template <class T> class Allocator {
...
template<class U, class... Args>
void construct(U* p, Args&&... args);
};
アロケータは、このメンバーを提供しない場合、allocator_traits
を提供しますデフォルト実装。
allocator_traits<allocator_type>::construct(the_allocator, *ugly details*);
scoped_allocator_adaptor
がallocator_traits
がこれに転送するカスタムconstruct
の機能を提供します。いずれにせよ、コンテナはすべてvalue_type
のこのconstruct
機能を使用して、しかしallocator_traits
を通してそれを使用して、直接allocator
を使用していないを構築する必要がありますuses_allocator
形質を利用し、正しいアロケータをvalue_type
コンストラクタに渡します。コンテナは、これらの細部に恵まれないままです。コンテナはallocator_traits construct
関数を使用してvalue_type
を構築する必要があることだけを知っていなければなりません。
ステートフルなアロケータを正しく処理するには、コンテナが処理しなければならない詳細があります。これらの詳細についても、コンテナには何の前提もなく、すべてのプロパティと動作をallocator_traits
経由で取得することで対処します。コンテナは、pointer
がT*
であるとも仮定できません。むしろこのタイプはそれが何であるかallocator_traits
を求めることによって見つけられる。
つまり、C++ 11コンテナを構築するには、allocator_traits
を調べてください。クライアントがscoped_allocator_adaptor
を使用している場合、スコープ付きアロケータ動作を無料で取得できます。