2016-05-24 14 views
14

abzuleiten Ich habe Probleme mit der Ableitung eines Typs eines einzelnen Elements eines C++ - Array.Gibt es eine Möglichkeit, einen Typ eines einzelnen Elements eines Arrays in C++

Ich möchte so etwas wie tun erreichen:

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]; 
} 

Aber der Code offenbar nicht kompiliert (der int [5] entspricht nicht T []) ...

Antwort

12

Sie benötigen ein zusätzliches Argument für die Spezialisierung:

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

Alternativ:

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

Oder:

auto element = a[0]; 
+0

Natürlich! Vielen Dank! –

+0

Der eigentliche Code ist etwas komplexer (ist innerhalb von Templates) und die Methode mit 'declltype' wäre dort nicht sehr sauber ... Aber Ihr Vorschlag mit zusätzlichen Parametern der Spezialisierung passt perfekt! –

12

Verwenden std::remove_extent Template-Klasse (C++ 11) oder std::remove_extent_t alias Vorlage (C++ 14) einen Typ eines Array-Elements zu erhalten (beide 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

Sie können auch std::remove_all_extents (C++ 11) oderverwenden 0 (C++ 14) bis get a type of an element of a multidimensional array.

+0

Schön! Ich wusste nichts davon! –