Есть ли способ вывести тип одного элемента массива в С++

У меня возникла проблема с выводом типа одного элемента массива С++.

Я хотел бы сделать что-то вроде:

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

Но код явно не компилируется (int [5] не соответствует T [])...

Ответ 1

Вам понадобится дополнительный аргумент для специализации:

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

В качестве альтернативы:

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

Или:

auto element = a[0];

Ответ 2

Используйте шаблон шаблона std::remove_extent (С++ 11) или std::remove_extent_t (С++ 14), чтобы получить тип элемента массива (оба объявлены в type_traits файле заголовка):

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

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

Live demo

Вы также можете использовать std::remove_all_extents (С++ 11) или std::remove_all_extents_t (С++ 14) в получить тип элемента многомерный массив.