2016-05-24 11 views
14

Mam problem z dedukcją typu pojedynczego elementu tablicy C++.Czy istnieje sposób na dedukcję typu pojedynczego elementu tablicy w C++

chciałbym zrobić coś takiego osiągnąć:

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

ale kod oczywiście nie kompiluje (int [5] nie pasuje T []) ...

Odpowiedz

12

Państwo potrzebować dodatkowy argument dla specjalizacji:

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

Alternatywnie:

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

Lub:

auto element = a[0]; 
+0

Oczywiście! Dzięki! –

+0

Rzeczywisty kod jest nieco bardziej skomplikowany (jest wewnątrz argumentu szablonów) i użycie podejścia z 'decltype' nie byłoby tam bardzo czyste ... Ale twoja sugestia z dodatkowym parametrem specjalizacji doskonale pasuje! –

12

Zastosowanie std::remove_extent klasa szablon (C++ 11) lub std::remove_extent_t alias szablon (C++ 14), aby uzyskać typ elementu tablicy (zarówno 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

można również użyć std::remove_all_extents (C++ 11) lub std::remove_all_extents_t (C++ 14) do get a type of an element of a multidimensional array.

+0

Nice! Nie wiedziałem o tym! –

Powiązane problemy