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.

dragonroot
źródło
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);
0x499602D2
źródło
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