2015-07-25 8 views
6

Ich studiere neue Funktionen von C++ 11 und ich fand std::remove_extent.Wofür kann std :: remove_extent verwendet werden?

typedef std::remove_extent<int[24]>::type A; // A is int 

Allerdings kann ich keine Verwendung dafür finden, beiseite einen neuen Typs von einem vorhandenen Typ von der Definition durch eine Dimension aus der gegebenen Art zu entfernen.

Kann jemand vorschlagen, warum C++ 11 diese Funktion eingeführt hat? Gibt es Vorteile bei der Verwendung?

+2

Warum suchen Sie nicht nach "remove_extent"? Bei SO gibt es z.B. [diese Antwort] (http://stackoverflow.com/a/10150181/), die 'remove_extent' verwendet. – dyp

+0

"Ich kann dafür keine Verwendung finden, abgesehen von ..." - Was Sie dort erwähnen, ist der ganze Sinn dieses Themas, also haben Sie gerade Ihre Frage beantwortet. Genauer gesagt, der Typ, von dem Sie den Extent entfernen, könnte hinter dem 'typedef' oder häufiger einem Template-Parameter verborgen sein. – milleniumbug

Antwort

8

Es gibt ein gutes Beispiel für die Verwendung von std::remove_extent im C++ Standard selbst.

Template-Funktion, die ein Objekt des Smart Pointer std::unique_ptr

template <class T> unique_ptr<T> make_unique(size_t n); 

liefert den folgenden Ausdruck (20.8.1.4 unique_ptr Schaffung p. # 4)

unique_ptr<T>(new remove_extent_t<T>[n]()) 

Betrachten Sie zum Beispiel Deklaration erzeugt

auto p2 = std::make_unique<int[][10]>(2); 

In diesem Fall muss make_unique Dimen entfernen sion wie [] in der Typdeklaration int[][10] angegeben und ersetzen Sie sie für [2] bekommen int[2][10] in der neuen Ausdruck.

2

Wenn Sie mit Arrays arbeiten, müssen Sie möglicherweise die Gesamtzahl der Elemente ermitteln, die das Array einschließlich der Sub-Arrays enthält. Dies kann mit einer Template-Metaprogrammierung unter Verwendung von std::extent und std::rank zusammen mit std::remove_extent erfolgen.

template <class T, std::size_t N = std::extent<T>::value > 
struct total_elements 
{ 
    using M_type = typename std::remove_extent<T>::type; 
    static constexpr std::size_t value = N * total_elements<M_type>::value; 
}; 

template <class T> 
struct total_elements<T, 0> : std::integral_constant<std::size_t, 1> {}; 

Live example.

sein Dies kann besonders nützlich, wenn Sie mit vector von vectors arbeiten, weil die Lagerung nicht gewährleistet ist zusammenhängend sein: durch die Gesamtzahl von Elementen und ein 1D geben vector, Sie, dass erhalten wird. Sie benötigen auch einige Zeigerarithmetik, damit sie sich so verhält, als ob sie mehrdimensional wäre, aber in einer Klasse ist das leicht zu abstrahieren.


Als Anmerkung, ist der Standard nicht verpflichtet Sie, es zu benutzen: Wenn Sie einen Platz finden, wo es sinnvoll sein kann, dann gehen sie.

Verwandte Themen