C++0xで使用されるアロケータのメンバータイプを照会するための標準のC++03インターフェイスがないのはなぜですか?メンバータイプが十分でないユースケースは何ですか?
2 に答える
デザインパターンの観点からallocator_traitsを説明するために、実装要件がはるかに少ない(構築、破棄、これらすべてのtypedefの必要がない...)カスタムアロケータをラップするアダプターであり、残りの部分を完了するFlyWeightオブジェクトに変換します。静的メンバーと型を使用するためのアロケータ実装要件。
allocator_traitsを使用すると、open-std doc Scoped Allocator Modelの3ページにあるように、カスタムアロケータに最低10行のコードを提供する必要があります(言及するために@icecrimeにthx)。
allocator_traitsとallocatorは、実装の詳細の負担を軽減するために、FlyWeight以外のオブジェクトをFlyWeightに変換する実例として考えています。クラスをFlyWeightに変換するための優れたAPI設計手法であり、そもそもFlyWeightであるはずです。
Javaプログラマーにとって、デザインパターンの観点から、std :: allocator_traitsは、java.lang.CharacterDataから継承して静的Unicode定義とヘルパーを提供するパッケージプライベートクラスCharacterDataLatin1、ChracterData00、CharacterData0E、01、02...のようなものです。 Character(std :: allocator)クラスのすべてのインスタンスで共有されます。
編集:allocator_traitsを介してカスタムアロケータを間接的に呼び出すもう1つの利点は、前方互換性が保証されることです(スコープアロケータモデルの3ページ)。要件の数は将来増加する可能性があり、アロケータに新しい要件を実装することに無知であっても、それらの要件はコンパイラの製造元によって実装されたallocator_traitsにすでに存在します。C ++コンテナがallocator_traitsによって間接的にアロケータを呼び出すことを知っているので、カスタムアロケータを使用するSTLコンテナは、コードを変更することなく、新しい要件の恩恵を受けることができます。
私はこの種のことには(まったく)精通していませんが、このドキュメントは、背後にある理論的根拠を理解するための良い出発点のようですallocator_traits
:
この提案の
allocator_traits
要は、アロケータを使用するための型と静的メンバー関数を含むテンプレート の定義であり、フランクフルトで失われた概念を効果的に置き換えAllocator
ます。