2013-01-03 69 views
10

想了解更多有關如何將標準庫實際上是實現我檢查在Visual Studio中的所有容器..在這裏,我看到了一些奇怪的結構:(模板)rebind <>做了什麼?

在一些基類std::list<>的下面的typedef發現

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

其中「_Alloc」與分配器模板參數(和_Ty包含的類型)相對應。我無法找到這個「關鍵字」的好解釋。迄今爲止我發現的最好的是它是分配器接口的一部分。雖然即使cppreference也不是很好解釋這一點。

這是什麼template rebind<>?爲什麼在那個地方需要?

+0

相關,請參閱[爲什麼allocator :: rebind必要時,我們有模板模板參數?](http://stackoverflow.com/q/12362363) – jww

回答

14

_Alloc模板用於獲取某種類型的對象。容器可能需要分配不同類型的對象。例如,當您有std::list<T, A>時,分配器A用於分配T類型的對象,但std::list<T, A>實際上需要分配某些節點類型的對象。調用節點類型_Ty時,std::list<T, A>需要獲取使用A提供的分配機制的_Ty對象的分配器。使用

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

指定相應的類型。現在,在這個聲明中的一些語法的煩惱:

  1. 由於rebind_A_A成員模板是一個模板參數,rebind成爲一個從屬名稱。要指示從屬名稱是模板,它需要以template作爲前綴。如果沒有template關鍵字,則<將被認爲是不到的運算符。
  2. 名稱other也依賴於模板參數,即它也是一個從屬名稱。爲了表明從屬名稱是一個類型,需要typename關鍵字。
+0

等待,但這將意味着(當列表是'std :: list '); 'rebind '變得多餘?因爲它會將「T」轉換爲「T」型? – paul23

+0

@ paul23:如果'_Ty'是模板參數,而不是'typedef _Node <_T> _Ty',可能對確保分配器創建合適的類型有用。雖然我很確定'std :: list '中的'A'需要能夠處理'T'對象,不同的分配器可能會被傳入。我不確定標準需求。它可能是支持不同類型分配器的擴展。 –

+0

T列表分配包含T作爲成員的節點。所以T分配器對它直接無用。相反,它創造了一個新的。您的評論對我沒有意義@ paul23 – Yakk

3

rebind用於爲與正在實施的容器的元素類型不同的類型分配內存。從this MSDN article採取:

例如,給定類型A的分配器對象人,則可以分配類型_其他的目的與表達:

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

或者,也可以通過指定其指針類型寫作類型:

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

0

請檢查該http://www.cplusplus.com/reference/memory/allocator/

你會看到

重新綁定< ...>實際上是類分配的成員是不給執行源代碼STL的一部分。

正如你看到的,rebind < ...>也是一個模板,它值得一個類型讓分配器類知道什麼是我的rebind成員。

回到您的聲明: typedef typename _Alloc :: template rebind < _Ty> :: other _Alty; 如果您省略模板: typedef typename _Alloc :: rebind < _Ty> :: other _Alty; 您可以輕鬆理解rebind是_Alloc的成員,但編譯器無法理解。

鑑於rebind是模板的性質,模板rebind < _Ty>是需要的,並且整體而言不是兩個部分而是被視爲 。

0

實施例STDC的代碼++:/usr/include/4.8/ext/new_allocator.h

重新綁定定義爲分配器類的結構構件;這種結構限定了構件其他被定義爲專用於一個不同的參數類型的分配器的一個實例(其他構件限定,可以創建不同類型的對象的分配器類)

template<typename _Tp> 
    class new_allocator 
    { 
    public: 
     ... 
     template<typename _Tp1> 
     struct rebind 
     { typedef new_allocator<_Tp1> other; }; 

當它被用於:

typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; 

分配器的類型被作爲

typename _Alloc::template rebind<_Tp>::other 
引用

現在,typedef用於定義_Tp_alloc_type - 然後可將其用作同一事物的較短名稱。

一個示例用法是在std :: list中,內部列表節點也需要它的分配器,它是從參數分配器重新定義的。

相關問題