33

標準ライブラリが実際にどのように実装されているかについて詳しく学ぼうとしています。ビジュアルスタジオですべてのコンテナを調べています。

のいくつかの基本クラスで、std::list<>次の typedef が見つかりました

typedef typename _Alloc::template rebind<_Ty>::other _Alty;

"_Alloc" はアロケータ テンプレート引数 (および _Ty に含まれる型) に対応します。この「キーワード」の適切な説明を見つけるのに苦労しています。これまでに見つけた最も良い点は、それがアロケーター インターフェイスの一部であることです。cppreferenceでさえ、これを説明するのにはあまり適していません。

これは何をしtemplate rebind<>ますか?そして、なぜその場所でそれが必要なのですか?

4

4 に答える 4

37

_Allocテンプレートは、何らかのタイプのオブジェクトを取得するために使用されます。コンテナには、異なるタイプのオブジェクトを割り当てる必要がある場合があります。たとえば、 がある場合std::list<T, A>、アロケータAはタイプのオブジェクトを割り当てることを意図していますTが、std::list<T, A>実際には は何らかのノード タイプのオブジェクトを割り当てる必要があります。ノード タイプ_Tyを呼び出して、が提供する割り当てメカニズムを使用しているオブジェクトstd::list<T, A>のアロケータを取得する必要があります。使用する_TyA

typename _A::template rebind<_Ty>::other

対応するタイプを指定します。さて、この宣言には構文上の問題がいくつかあります。

  1. rebindは のメンバー テンプレートで_Aあり、_Aはテンプレート引数であるため、はrebind従属名になります。従属名がテンプレートであることを示すには、接頭辞を付ける必要がありますtemplatetemplateキーワードがないと、小<なり演算子と見なされます。
  2. 名前otherもテンプレート引数に依存します。つまり、依存名でもあります。従属名がタイプであることを示すには、typenameキーワードが必要です。
于 2013-01-03T23:18:10.217 に答える
9

rebind実装されているコンテナの要素型とは異なる型にメモリを割り当てるためのものです。この MSDN の記事から取得します。

たとえば、タイプ A のアロケーター オブジェクト al が与えられた場合、次の式でタイプ _Other のオブジェクトを割り当てることができ

A::rebind<Other>::other(al).allocate(1, (Other *)0)

ます。

A::rebind<Other>::other::pointer

于 2013-01-03T23:17:45.523 に答える
0

これをチェックしてください http://www.cplusplus.com/reference/memory/allocator/

あなたが見るでしょう

rebind<...> は実際には、実装のソース コードを提供せずに STL の一部であるクラス アロケーターのメンバーです。

ご覧のとおり、 rebind<...> もテンプレートであり、アロケーター クラスが rebind メンバーの内容を認識できるようにするための型に値します。

ステートメントに戻ります: typedef typename _Alloc::template rebind<_Ty>::other _Alty; テンプレートを省略した場合: typedef typename _Alloc::rebind<_Ty>::other _Alty; rebind が _Alloc のメンバーであることは簡単に理解できますが、コンパイラは理解できません。

テンプレートである rebind の性質を考えると、テンプレート rebind<_Ty> が必要であり、2 つの部分ではなく全体として扱われます。

于 2014-05-30T09:07:42.783 に答える