2016-09-05 40 views
2

這個問題跟我以前的一樣:Why shouldn't C++ operator new/delete/variants be in header files?。爲了快速總結,我正在學習覆蓋全球運營商newdelete等。我現在需要一個自定義分配器類(我的重載運算符新調用std::set::insert(...),這似乎本身稱爲new,因此無限回憶)。我認爲如果我提供自定義分配器(例如,使用malloc而不是new)到我的std::set我可以繞過無限遞歸。struct rebind :: other是什麼意思?

我已經做了一些關於實現自定義分配器的閱讀,並且對struct rebind的語義有些困惑。

有一個很好的Q &這裏:Parsing allocator::rebind calls,但我仍然困惑於一個特定的項目。 cplusplus.com說,大約struct rebind

它的成員類型另一種是相當於分配器類型分配我不明白怎麼otherstruct rebind成員類型類型

的元素。該定義爲struct rebind我發現的樣子:

template <class Type> struct rebind { 
    typedef allocator<Type> other; 
}; 

我看不出otherstruct rebind一個成員變量。這只是typedef版。如果我在全局命名空間中做了typedef int foo;,那並不意味着在全局命名空間中聲明瞭一個全局變量int,那麼other又如何成爲struct rebind的成員?順便說一下,我知道(或者至少我已經閱讀過),這已經在C++ 11之後被簡化了,但我仍然想首先理解這一點,這樣我就可以理解我的基本原理了。謝謝你的幫助。

雖然在這個話題上,有人可以解釋一個結構內的typedef ing嗎?我在回答者Johannes Schaub的這amazing example之前看過一次,但我還沒有完全理解它。對我來說,它看起來像是將typedef的範圍限制在包含結構的實例中。

UPDATE:

我想加入到我的問題。使用從cppreference.com這個刪節例如:

#include <memory> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::allocator<int> a1; // default allocator for ints 

    decltype(a1)::rebind<std::string>::other a2_1; 
} 

是不是行decltype(a1)::rebind<std::string>::other a2_1;std::allocator<std::string> a2_1;很長的路要走?

+0

'struct'中的typedef'ing允許你根據給定的模板來選擇一個類型。就這樣。你可能有專門的地方做特別的事情,但就是這樣。儘管'make_integer_sequence'的實現使用了一些很酷的遞歸來爲你提供所需的東西。 – AndyG

回答

4

我不明白其他是怎麼樣的成員變量struct rebind

不是。

這只是typedef ed。

沒錯。這是一個類型的成員,就像引用說的那樣。

雖然在這個話題上,有人也可以解釋一個結構中typedefing的處理嗎?在回答Johannes Schaub這個令人驚歎的例子中,我曾經見過一次,但我還沒有完全理解它。

很難給不會只是有同樣的問題(如你沒有說明你不理解litb的例子)的例子,但在這裏我們去:

struct Foo 
{ 
    typedef int bar; 
}; 

Foo::bar x = 42; // creates an int named `x`, because Foo::bar is int 

對我來說,它看起來像是將typedef的範圍限制在包含結構的實例中。

沒錯。結果類型是類的成員,就像嵌套類一樣,就像一個類是其封閉名稱空間的成員一樣。

順便說一句,我知道(或至少我讀過)這所有被簡化後C++ 11

沒有,成員類型並沒有從根本上的任何修訂改變該語言(儘管新的using語法可以更容易地聲明它們)。

如果我在全局命名空間確實typedef int foo;,這並不意味着有全局命名空間

沒有,但聲明int類型的全局變量會有稱爲foo在全局命名空間中。

是不是行decltype(a1)::rebind<std::string>::other a2_1;很長的路要說std::allocator<std::string> a2_1;

是的;很長的路要走,不管什麼a1都是有效的(所以結果可能不是std::allocator<T>)。這在編寫模板時很重要。

+0

迷人。再次感謝@LightnessRacesInOrbit(我想你以前回答過我的其他問題)。成員_types_與成員_variables_相對的這一概念對我來說是新的。不過,你的回答正在幫助我獲得照片。並不是我曾經認爲自己是最偉大的C++程序員,但我曾經(天真地)認爲我掌握了這門語言。多麼有趣,有這樣的新奇發現。 – StoneThrow

+1

@StoneThrow:哦這麼多:)而且大多數都是非常可笑的lol –

+0

@StoneThrow:成員類型被用在C++標準庫中。例如,查看'std :: vector :: iterator'。 http://en.cppreference.com/w/cpp/container/vector – Jesin