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.