Domanda C'è un modo per dedurre un tipo di un singolo elemento di un array in c ++


Sto avendo problemi con la deduzione di un tipo di un singolo elemento di un array c ++.

Mi piacerebbe realizzare qualcosa del tipo:

template <class T>
struct array_element { };

template <class T>
struct array_element<T[]> {
   using type = T;
};

int main() {
   int a[5] = {1, 2, 3, 4, 5};
   array_element<decltype(a)>::type element = a[0];
}

Ma ovviamente il codice non viene compilato (l'int [5] non corrisponde a T []) ...


14
2018-05-24 11:09


origine


risposte:


Hai bisogno di un argomento extra per la specializzazione:

template <class T, size_t N>
struct array_element<T[N]> {
   using type = T;
};

In alternativa:

std::remove_reference<decltype(a[0])>::type element = a[0];

O:

auto element = a[0];

12
2018-05-24 11:12



Uso std::remove_extent template class (C ++ 11) o std::remove_extent_t alias template (C ++ 14) per ottenere un tipo di un elemento dell'array (entrambi sono dichiarati in type_traits file di intestazione):

std::remove_extent<decltype(a)>::type element0 = a[0];

std::remove_extent_t<decltype(a)> element1 = a[1];

Dimostrazione dal vivo

Puoi anche usare std::remove_all_extents (C ++ 11) o std::remove_all_extents_t (C ++ 14) a ottenere un tipo di elemento di una matrice multidimensionale.


12
2018-05-24 13:52