En programmation C, l'initialisation d'un tableau peut être simplifiée à l'aide de la syntaxe int arr[] = { e1, e2, e3 , ... }, où le nombre d'éléments est automatiquement déduit. Bien que std::array offre une alternative moderne aux tableaux C, il lui manque cette méthode d'initialisation pratique. Cet article explore les techniques pour émuler ce comportement avec std::array.
Une approche implique une fonction de modèle variadique :
template<class T, class... Tail> auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)> { std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... }; return a; }
Cette fonction prend un en-tête d'élément initial et un nombre quelconque d'éléments supplémentaires. comme queue. Il crée un std::array de la taille appropriée, en l'initialisant avec les éléments fournis. Par exemple, le code auto a = make_array(1, 2, 3); initialise un std::array contenant les éléments 1, 2 et 3.
Cependant, cette approche se heurte à des limites. Il repose sur la capacité du compilateur à optimiser la copie de la valeur renvoyée, qui n'est pas toujours fiable. De plus, il ne peut pas initialiser les types imbriqués, une fonctionnalité prise en charge par l'initialisation du tableau C. Pour surmonter ces limitations, envisagez les améliorations suivantes :
#define ARRAY(...) make_array(__VA_ARGS__)
template<class T, class... Tail> auto make_array(std::array<T, Size> head, Tail... tail) -> std::array<T, Size + sizeof...(Tail)> { std::array<T, Size + sizeof...(Tail)> a = { head, tail ... }; return a; }
Grâce à ces améliorations, l'initialisation de type imbriqué devient possible, comme le montre le exemple :
#define ARRAY(...) make_array(__VA_ARGS__) struct A { int a; int b; }; auto arr = ARRAY(A{1, 2}, A{3, 4});
Ces techniques fournissent une solution robuste pour émuler l'initialisation d'un tableau C avec std::array, permettant une initialisation pratique et concise des objets std::array dans le code C moderne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!