四分木疎行列クラスを作成しようとしています。つまり、aquadtree_matrix<T>
はゼロ行列または の 4 倍(ne, nw, se, sw)
ですquadtree_matrix<T>
。
これはおそらく線形代数演算のパフォーマンスに影響を与えるため、最終的にはさまざまな割り当てスキームをテストしたいと思います。quadtree_matrix
したがって、既存のアロケーターを再利用できるように、標準のアロケーターの型もテンプレート化します。
2 つの異なる種類のデータを割り当てる必要があります: a T
、または a のいずれかで、 node
4 つのポインター (T またはノードへの) を含みます。私が検討するすべてのアルゴリズムについて、アルゴリズムの任意の時点で直面している部分行列のサイズが何であるかを知っているため、どのような種類のデータが期待されるかを確実に知っています (これらのサイズを保存する必要さえありません)。
もちろん、2 つの異なるアロケーターを使用します。アロケーターの型はテンプレートとテンプレートのコピー コンストラクターを提供するため(標準コンテナーのメンバーがコピーを返すことで提案するrebind
ように、値の型として使用することを意図しています)、これで問題ありません。get_allocator
問題は、アロケーター メンバー関数が特定のpointer
型を使用することです。これはバニラ ポインターである必要はありません。一部のアロケータ (ブースト インタープロセス アロケータ) は、この機能を広範に使用します。
アロケーター ポインターの型がさまざまなポインターである場合、問題はありません。少なくとも、ポインターを使用して void を指定し、それらを正しい型 ( または のいずれnode*
かT*
) に再解釈_キャストすることができます。ユニオンを使用することもできます(おそらくより良いでしょう)。
私の知る限り、allocator::pointer
型の PODness に関する要件はありません。これらは、ランダム アクセス イテレータである必要があるだけです。
さて、私の質問は次のとおりです。
アロケータ クラス テンプレートA<T>
(またはそれに相当するものA::rebind<T>::other
) が与えられた場合、次のことが保証されますか。
- 提供された静的キャストの機能
A<T>::pointer
は、 ?のアクセス可能なベースです。A<U>::pointer
U
T
- 提供された静的キャストの機能
A<T>::pointer
はアクセス可能なベースであり、キャストの「ランタイム型」(このコンテキストでこれが意味するものは何でも) は?A<U>::pointer
T
U
U
- タイプ
A<void>::pointer
(これが理にかなっている場合)?
それとも、私が考えもしなかった問題の解決策はありますか?