Maison >développement back-end >C++ >Comment puis-je imiter l'initialisation d'un tableau de style C avec `std::array` en C ?

Comment puis-je imiter l'initialisation d'un tableau de style C avec `std::array` en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-17 20:23:14607parcourir

How Can I Mimic C-Style Array Initialization with `std::array` in C  ?

Émulation de l'initialisation d'un tableau C avec std::array

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 :

  • Utilisez une macro pour simplifier la syntaxe :
#define ARRAY(...) make_array(__VA_ARGS__)
  • Autoriser l'initialisation des types imbriqués en modifiant le signature de fonction :
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn