Bagaimana cara mendapatkan jumlah elemen di std :: array <T, N> tanpa harus membuat turunannya?

9

Ada std::array<T, N>::size(), tapi ini non-statis, jadi itu membutuhkan contoh std::array. Apakah ada cara untuk mendapatkan nilai yang dikembalikan (yang merupakan Ndari std::array<T, N>) tanpa harus membuat turunan dari array? Untuk array normal, saya bisa menggunakan sizeof, tetapi saya melihat tidak ada jaminan itu sizeof(std::array<T, N>) == N * sizeof(T)benar.

capung
sumber
Jika sudah N, mengapa Anda perlu meminta arrayuntuk memperbanyakinya untuk Anda?
ShadowRanger
@ShadowRanger Karena sizeof(std::array<T, N>) == N * sizeof(T)tidak harus benar.
NathanOliver
Karena array dapat diketikkan di tempat lain atau diteruskan sebagai argumen ke templat.
Dragonroot
1
Jika Anda ingin tahu jumlah elemen, gunakan saja N.
JohnFilleau
1
@dragonroot Apa gunanya semua ini? Jika Anda sudah Nmulai dengan, tidak perlu melalui semua ini untuk mendapatkan Nsecara tidak langsung, atau untuk memvalidasi itu N==N. Apa use case aktual yang Anda coba selesaikan?
Remy Lebeau

Jawaban:

14

Ada std::tuple_size<std::array>.

static_assert(std::tuple_size<std::array<int, 5>>::value == 5);
0x499602D2
sumber
Tidakkah std :: size () biasa dilakukan?
Jesper Juhl
2
@JesperJuhl Sebenarnya tidak, std::size()membutuhkan instance array.
0x499602D2
1
Ini tidak masuk akal untuk digunakan tuple_sizeseperti ini, jika Anda sudah tahu ukuran array di depan untuk meneruskannya ke template. Mungkin ini akan menjadi contoh yang lebih bermakna? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau
@RemyLebeau Saya kira O / P berpikir array menyatakan telah diteruskan sebagai argumen templat ke fungsi templat? Bahkan kemudian satu-satunya tujuan yang dapat saya lihat adalah untuk menetapkannya sebagai objek yang dikembalikan, yang masih membutuhkan instance untuk dibuat.
Permata Taylor