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