2015-07-25 12 views
6

Uczę się nowych funkcji dostarczanych przez C++ 11 i znalazłem std::remove_extent.Do czego można użyć std :: remove_extent?

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

Jednak nie mogę znaleźć serwera dla tego, oprócz zdefiniowania nowego typu z istniejącego typu usuwając wymiar z danego typu.

Czy ktoś mógłby zasugerować, dlaczego C++ 11 wprowadziło tę funkcję? Czy są jakieś korzyści z jej używania?

+2

Dlaczego nie szukasz "remove_extent"? Na SO istnieje np. [ta odpowiedź] (http://stackoverflow.com/a/10150181/), która używa 'remove_extent'. – dyp

+0

"Nie mogę znaleźć dla tego zastosowania, poza ..." - to, o czym wspomniałeś, jest w tym wszystkim ważne, więc właśnie odpowiedziałeś na swoje pytanie. Mówiąc dokładniej, typ, z którego usuwasz zakres, może być ukryty za parametrem "typedef" lub częściej jako szablon. – milleniumbug

Odpowiedz

8

Istnieje dobry przykład użycia std::remove_extent w samym standardzie C++.

szablon funkcja, która tworzy obiekt inteligentny wskaźnik std::unique_ptr

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

zwraca następujące wyrażenie (20.8.1.4 unique_ptr tworzenia str. # 4)

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

Rozważmy na przykład deklaracji

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

W tym przypadku make_unique należy usunąć dimen podana w deklaracji typu [] w deklaracji typu int[][10] i zastąpić ją dla [2] uzyskiwaniem int[2][10] w nowym wyrażeniu.

2

Podczas pracy z tablicami może być konieczne uzyskanie całkowitej liczby elementów, które zawiera tablica, w tym podprzestrzeni. Można to zrobić za pomocą szablonu meta-programowania, używając std::extent i std::rank wraz z std::remove_extent.

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.

ta może być szczególnie przydatna, jeśli pracujesz z vector z vectors ponieważ składowanie nie jest gwarantowana być ciągłe: dając całkowitą liczbę elementów i 1D vector, że będzie można uzyskać. Będziesz także potrzebował pewnej arytmetyki wskaźnika, aby zachowywał się tak, jakby był wielowymiarowy, ale łatwo można go streścić w klasie.


Uwaga: standard nie zobowiązuje do korzystania z niego: jeśli znajdziesz miejsce, w którym może być użyteczne, przejdź do niego.

Powiązane problemy