2016-05-24 12 views
14

Tôi đang gặp vấn đề với việc suy ra loại phần tử đơn lẻ của mảng C++.Có cách nào để suy ra một loại phần tử đơn lẻ của một mảng trong C++

Tôi muốn làm được điều gì đó như:

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

Nhưng mã rõ ràng là không biên dịch (int [5] không phù hợp với T []) ...

Trả lời

12

Bạn cần có lập luận thêm cho chuyên môn:

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

Hoặc:

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

Hoặc:

auto element = a[0]; 
+0

Tất nhiên! Cảm ơn! –

+0

Mã thực tế phức tạp hơn một chút (là đối số mẫu bên trong) và sử dụng cách tiếp cận với 'decltype' sẽ không được sạch lắm ... Nhưng đề xuất của bạn với thông số bổ sung về chuyên môn phù hợp hoàn hảo! –

12

Sử dụng std::remove_extent lớp mẫu (C++ 11) hoặc std::remove_extent_t alias mẫu (C++ 14) để có được một loại của một phần tử mảng (cả 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

Bạn cũng có thể sử dụng std::remove_all_extents (C++ 11) hoặc std::remove_all_extents_t (C++ 14) đến get a type of an element of a multidimensional array.

+0

Đẹp! Tôi không biết về điều này! –

Các vấn đề liên quan