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.
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
"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