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.


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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.