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
Libérer: 2024-12-17 20:23:14
original
599 Les gens l'ont consulté

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;
}
Copier après la connexion

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__)
Copier après la connexion
  • 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;
}
Copier après la connexion

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});
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal