Làm thế nào để có được số lượng phần tử trong std :: mảng <T, N> mà không phải tạo cá thể của nó?


9

std::array<T, N>::size(), nhưng nó không tĩnh, vì vậy nó đòi hỏi một thể hiện của std::array. Có cách nào để lấy giá trị mà nó trả về (là Ncủa std::array<T, N>) mà không phải xây dựng một thể hiện của mảng không? Đối với một mảng bình thường, tôi có thể đã sử dụng sizeof, nhưng tôi thấy không có gì đảm bảo đó sizeof(std::array<T, N>) == N * sizeof(T)là sự thật.


Nếu bạn có N, tại sao bạn cần phải yêu cầu arraysao chép nó cho bạn?
ShadowRanger

@ShadowRanger Bởi vì sizeof(std::array<T, N>) == N * sizeof(T)không phải là sự thật.
NathanOliver

Bởi vì mảng có thể được gõ ở nơi khác hoặc được truyền làm đối số cho mẫu.
Dragonroot

1
Nếu bạn muốn biết số lượng phần tử, chỉ cần sử dụng N.
JohnFilleau

1
@dragonroot Điểm của tất cả điều này là gì? Nếu bạn đã phải Nbắt đầu với, không cần phải trải qua tất cả điều này để có được Ngián tiếp, hoặc để xác nhận điều đó N==N. Trường hợp sử dụng thực tế mà bạn đang cố gắng giải quyết là gì?
Rémy Lebeau

Câu trả lời:


14

std::tuple_size<std::array>.

static_assert(std::tuple_size<std::array<int, 5>>::value == 5);

Sẽ không đơn giản std :: size () làm gì?
Jesper Juhl

2
@JesperJuhl Thật ra không, std::size()yêu cầu một thể hiện của mảng.
0x499602D2

1
tuple_sizeMặc dù vậy, sẽ không có ý nghĩa khi sử dụng như thế này, nếu bạn đã biết kích thước mảng ở phía trước để chuyển nó vào mẫu. Có lẽ đây sẽ là một ví dụ có ý nghĩa hơn? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Rémy Lebeau

@RemyLebeau Tôi đoán rằng O / P đang nghĩ rằng mảng giảm đã được truyền vào dưới dạng đối số mẫu cho hàm mẫu? Thậm chí sau đó mục đích duy nhất tôi có thể thấy là gán nó làm đối tượng trả về, vẫn yêu cầu một thể hiện được tạo.
Gem Taylor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.