Jak uzyskać liczbę elementów w std :: array <T, N> bez konieczności tworzenia instancji?


9

Jest std::array<T, N>::size(), ale jest niestatyczna, więc wymaga wystąpienia std::array. Czy istnieje sposób, aby uzyskać wartość powraca (który jest Nz std::array<T, N>) bez konieczności konstruowania instancji tablicy? Do normalnej tablicy mógłbym użyćsizeof , ale nie widzę żadnej gwarancji, że sizeof(std::array<T, N>) == N * sizeof(T)to prawda.


Jeśli tak N, dlaczego musisz poprosić arrayo jego odtworzenie?
ShadowRanger

@ShadowRanger Ponieważ sizeof(std::array<T, N>) == N * sizeof(T)nie musi to być prawda.
NathanOliver

Ponieważ tablicę można wpisać w innym miejscu lub przekazać jako szablon do szablonu.
Dragonroot

1
Jeśli chcesz poznać liczbę elementów, po prostu użyj N.
JohnFilleau

1
@dragonroot Jaki jest sens tego wszystkiego? Jeśli musisz już Nzacząć, nie musisz przechodzić przez to wszystko, aby uzyskać Npośrednio lub zweryfikować to N==N. Jaki jest rzeczywisty przypadek użycia , który próbujesz rozwiązać?
Remy Lebeau

Odpowiedzi:


14

Jest std::tuple_size<std::array>.

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

Czy zwykły std :: size () nie zrobiłby?
Jesper Juhl

2
@JesperJuhl Właściwie nie, std::size()wymaga instancji tablicy.
0x499602D2

1
Nie ma jednak sensu używać tuple_sizetego w ten sposób, jeśli znasz już rozmiar tablicy z góry, aby przekazać ją do szablonu. Może to byłby bardziej znaczący przykład? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemyLebeau Myślę, że O / P myśli, że deklaracja tablicy została przekazana jako argument szablonu do funkcji szablonu? Nawet wtedy jedynym celem, jaki widzę, jest przypisanie go jako zwróconego obiektu, który nadal wymaga utworzenia instancji.
Gem Taylor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.