web-dev-qa-db-fra.com

Récupère la taille de std :: array sans instance

Compte tenu de cette structure:

struct Foo {
  std::array<int, 8> bar;
};

Comment obtenir le nombre d'éléments du tableau bar si je n'ai pas d'instance de Foo?

49
ChronoTrigger

Vous pouvez utiliser std::Tuple_size :

std::Tuple_size<decltype(Foo::bar)>::value
81
Jarod42

Malgré bonne réponse de @ Jarod42, voici une autre solution possible basée sur decltype qui n'utilise pas Tuple_size.
Il suit un exemple minimal et fonctionnel qui fonctionne en C++ 11:

#include<array>

struct Foo {
    std::array<int, 8> bar;
};

int main() {
    constexpr std::size_t N = decltype(Foo::bar){}.size();
    static_assert(N == 8, "!");
}

std::array possède déjà une fonction membre constexpr nommée size qui renvoie la valeur que vous recherchez.

26
skypjack

Vous pouvez donner à Foo un public static constexpr membre.

struct Foo {
 static constexpr std::size_t bar_size = 8;
 std::array<int, bar_size> bar;
}

Vous connaissez maintenant la taille de la barre de Foo::bar_size et vous avez la flexibilité supplémentaire de nommer bar_size vers quelque chose de plus descriptif si Foo a déjà plusieurs tableaux de la même taille.

7
Willy Goat

Vous pouvez le faire de la même manière que pour les baies héritées:

sizeof(Foo::bar) / sizeof(Foo::bar[0])
3
Waxrat

Utilisation:

sizeof(Foo::bar) / sizeof(int)
0
Gilson PJ