2

私はcplusplusの初心者です、そして私の質問に答えてくれてありがとう。

stl_list.hの段落は、次のように読み取られます。

// NOTA BENE
// The stored instance is not actually of "allocator_type"'s
// type.  Instead we rebind the type to
// Allocator<List_node<Tp>>, which according to [20.1.5]/4
// should probably be the same.  List_node<Tp> is not the same
// size as Tp (it's two pointers larger), and specializations on
// Tp may go unused because List_node<Tp> is being bound
// instead.
//
// We put this to the test in the constructors and in
// get_allocator, where we use conversions between
// allocator_type and _Node_alloc_type. The conversion is
// required by table 32 in [20.1.5].
  1. [20.1.5] / 4とそのようなテーブル32のものはどこにありますか?
  2. Tpのスペシャライゼーションが使用されないのはなぜですか?これは実際にはどういう意味ですか?(簡単なソースコードと簡単な説明を提供していただければ幸いです。)
  3. 人々が専門分野を必要とする場合、それをハックする方法はありますか?? :)
4

3 に答える 3

3
  1. Paulがすでに示したように、これらはC++標準への参照です。(彼が投稿したリンクは著作権を侵害しており、標準の古いコピーですが)次のようなリファレンスをここで読んでください。

    N3376 23.2.1 [container.requirements.general]/6
    ^^^^^ Version of the standard working paper being discussed
          ^^^^^^ Clause / subclause in the standard being discussed
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ section name
                              paragraph number    ^
    

    標準参照で印刷されたセクション見出しが表示される理由は[]、標準の異なるワーキングペーパーのコピーが条項番号に関してセクションを移動するためですが、セクション見出しは比較的一定です。(たとえば、誰かがN3376よりも新しい標準のワーキングペーパーを使用している場合、彼らは[container.requirements.general]私が話していたセクションを検索して見つけることができます)
    段落番号は、副節番号と区別するために別々にリストされています。たとえば23.2.1、23.2節の段落1ですか、それとも節全体23.2.1ですか?それを分離すると、これがより明確になります。

  2. これは、アロケータクラスのテンプレート特殊化を作成する場合、特定のタイプに対するテンプレート特殊化が未使用になる可能性があることを意味します。代わりにプライマリテンプレートを使用します。これは、アロケータの特殊化がタイプに基づいているためです。に特別なことを行うプライマリテンプレートmy_allocator<Type>とスペシャライゼーションがあるとします。ただし、これはリンクリストであるため、sではなくオブジェクトを割り当てる必要があります。したがって、代わりに作成し、スペシャライゼーションを未使用のままにします。その他の例と要点については、StephanT.Lavavejの優れたシリーズであるCoreC++、n「テンプレートスペシャライゼーション」のパート5を 参照してください。my_allocator<int>intstd::listlist_node<int>intmy_allocator<list_node<int>><int>

  3. できません; 少なくとも標準的な方法ではありません。listリストノードに使用する内部名は、実装によって定義されます。特殊化するためにポータブルコードでそのタイプに名前を付けることはできません。

于 2012-12-01T08:16:15.460 に答える
2

あなたの質問について1:

これは、アロケータの要件に関連するISOC++標準への参照のようです。1998年のC++標準のコピーをここで見つけました:

http://www-d0.fnal.gov/~dladams/cxx_standard.pdf

PDFの354ページ(380ページ)をご覧ください。表32は2ページに表示されます。

あなたの質問2と3に関しては、それは私の賃金等級をはるかに上回っています。特殊化によって、Tpから派生したクラスを意味することを危険にさらす可能性があります。しかし、私にはわかりません。

于 2012-12-01T06:55:34.277 に答える
1

タイプの場合、 (一般的に)タイプの値と前および次の要素へのポインタを保持するために(または同様の)std::listクラスを利用します。明らかに、アロケータを使用してこれらの値を作成する場合、必要なのは実際にはタイプではなく、タイプです。これが、アロケータを再バインドする必要がある理由です。したがって、リストクラスのさらに先には、のようなものが表示されます。nodeTpTpnode<Tp>std::allocator<Tp>::template rebind<node<Tp>>

node<Tp>スペシャライゼーションが未使用になる理由は、内部的にはの代わりに割り当てているためですTp。したがって、独自のアロケータクラスを作成し、それをに特化した場合Tp、この特殊化はに使用されませんstd::list。例えば:

template <typename T>
class my_allocator
{
     //typedefs
     pointer allocate(...);
     void deallocate(...);

     //Other member functions
};

template <>
class my_allocator<int>
{
     //Some specialization for int
     ...

};

さて、を使用した場合std::list<int, my_allocator<int>>、アロケータがリバウンドするため、特殊化されてmy_allocator<node<int>>いないものを使用してしまう可能性があるため、特殊化されていないバージョンを使用しmy_allocatorます。

のような特殊化が必要な場合はstd::list、内部ノードのようなクラスが使用するものに特化することでハッキングできる可能性がありますがstd::list、これはほぼ確実に移植性がないため、お勧めしません。

于 2012-12-01T08:17:04.123 に答える