有没有办法在c ++中推导出一个数组元素的类型

时间:2016-05-24 11:09:51

标签: c++ templates c++11 sfinae typetraits

我在推断c ++数组的单个元素的类型方面遇到了问题。

我想做到这样的事情:

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 []不匹配...

2 个答案:

答案 0 :(得分:12)

您需要额外的专业化参数:

KDevelop

可替换地:

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

或者:

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

答案 1 :(得分:12)

使用std::remove_extent模板类(C ++ 11)或std::remove_extent_t别名模板(C ++ 14)来获取数组元素的类型(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

您也可以std::remove_all_extents(C ++ 11)或std::remove_all_extents_t(C ++ 14)使用get a type of an element of a multidimensional array