Wie kann man die Anzahl der Elemente in std :: array <T, N> ermitteln, ohne seine Instanz erstellen zu müssen?


9

Es gibt std::array<T, N>::size(), aber es ist nicht statisch, daher ist eine Instanz von erforderlich std::array. Gibt es eine Möglichkeit, den zurückgegebenen Wert (der der Nvon ist std::array<T, N>) abzurufen, ohne eine Instanz des Arrays erstellen zu müssen? Für ein normales Array hätte ich es verwenden können sizeof, aber ich sehe keine Garantie sizeof(std::array<T, N>) == N * sizeof(T)dafür.


Wenn Nja, warum müssen Sie darum bitten array, es für Sie zu reproduzieren?
ShadowRanger

@ShadowRanger Weil sizeof(std::array<T, N>) == N * sizeof(T)muss nicht wahr sein.
NathanOliver

Weil das Array an anderer Stelle typisiert oder als Argument an eine Vorlage übergeben werden kann.
Drachenwurzel

1
Wenn Sie die Anzahl der Elemente wissen möchten, verwenden Sie einfach N.
JohnFilleau

1
@dragonroot Was ist der Sinn all dessen? Wenn Sie bereits damit Nbeginnen müssen, müssen Sie dies alles nicht durchlaufen, um Nindirekt zu werden oder dies zu validieren N==N. Was ist der tatsächliche Anwendungsfall , den Sie lösen möchten?
Remy Lebeau

Antworten:


14

Es gibt std::tuple_size<std::array>.

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


2
@JesperJuhl Eigentlich nein, std::size()erfordert eine Instanz des Arrays.
0x499602D2

1
Es ist jedoch nicht sinnvoll, dies zu verwenden tuple_size, wenn Sie die Array-Größe bereits im Voraus kennen, um sie an die Vorlage zu übergeben. Vielleicht wäre dies ein aussagekräftigeres Beispiel? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemyLebeau Ich denke, das O / P denkt, dass die Array-Deklaration als Vorlagenargument an eine Vorlagenfunktion übergeben wurde. Selbst dann kann ich nur sehen, dass es als zurückgegebenes Objekt zugewiesen wird, für das noch eine Instanz erstellt werden muss.
Gem Taylor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.