2016-05-24 12 views
14

Sto avendo problemi con la deduzione di un tipo di un singolo elemento di un array C++.C'è un modo per dedurre un tipo di un singolo elemento di un array in C++

vorrei fare realizzare qualcosa di simile:

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 []) ...

risposta

12

È necessario un argomento extra per la specializzazione:

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

alternativa:

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

Oppure:

auto element = a[0]; 
+0

Naturalmente! Grazie! –

+0

Il codice effettivo è un po 'più complesso (si trova all'interno dell'argomento templates) e l'utilizzo dell'approccio con 'decltype' non sarebbe molto pulito lì ... Ma il tuo suggerimento con parametro aggiuntivo di specializzazione si adatta perfettamente! –

12

Usa std::remove_extent classe modello (C++ 11) o std::remove_extent_t modello alias (C++ 14) per ottenere un tipo di un elemento di matrice (entrambi are declared in type_traits header file):

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

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

Live demo

È inoltre possibile utilizzare std::remove_all_extents (C++ 11) o std::remove_all_extents_t (C++ 14) a get a type of an element of a multidimensional array.

+0

Bello! Non sapevo di questo! –

Problemi correlati