Örnek oluşturmak zorunda kalmadan std :: array <T, N> öğelerinin sayısını nasıl alabilirim?


9

Var std::array<T, N>::size(), ama statik değil, bu yüzden bir örneği gerektirir std::array. (Olup döndürür değeri elde etmek için bir yol var Nbir std::array<T, N>dizinin bir örneğini oluşturmak zorunda kalmadan)? Normal bir dizi için kullanmış olabilirdim sizeof, ama sizeof(std::array<T, N>) == N * sizeof(T)doğru olduğunu garanti edemiyorum.


Varsa N, neden sizin arrayiçin çoğaltmanızı istemelisiniz ?
ShadowRanger

@ShadowRanger Çünkü sizeof(std::array<T, N>) == N * sizeof(T)doğru olmak zorunda değil.
NathanOliver

Çünkü dizi başka bir yerde yazılabilir veya bir şablona argüman olarak iletilebilir.
dragonroot

1
Eleman sayısını bilmek istiyorsanız, sadece kullanın N.
JohnFilleau

1
@dragonroot Bütün bunların anlamı nedir? Zaten Nbaşlamak zorundaysanız , Ndolaylı olarak almak veya doğrulamak için tüm bunlardan geçmenize gerek yoktur N==N. Çözmeye çalıştığınız gerçek kullanım durumu nedir ?
Remy Lebeau

Yanıtlar:


14

Var std::tuple_size<std::array>.

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

Düz std :: size () yapmaz mı?
Jesper Juhl

2
@JesperJuhl Aslında hayır, std::size()dizinin bir örneğini gerektirir.
0x499602D2

1
tuple_sizeEğer şablonun önüne geçmek için önceden dizi boyutunu biliyorsanız, bu şekilde kullanmak mantıklı değildir . Belki bu daha anlamlı bir örnek olabilir? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemLebeau Sanırım O / P dizi decl bir şablon işlevine bir şablon argümanı olarak geçti düşünüyor? O zaman bile görebildiğim tek amaç, onu bir nesne oluşturulmasını gerektiren döndürülen nesne olarak atamaktır.
Gem Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.