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.