Maison >développement back-end >C++ >Comment initialiser un `std::array` constructible autre que par défaut sans répétition en C ?

Comment initialiser un `std::array` constructible autre que par défaut sans répétition en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 03:31:02789parcourir

How to Initialize a Non-Default Constructible `std::array` Without Repetition in C  ?

Initialisation d'un std::array constructible non par défaut sans répétition

En C, initialisation d'un std::array d'éléments constructibles non par défaut peut être un défi. Les méthodes d'initialisation standard deviennent fastidieuses lorsque n, la taille du tableau, est grand ou est un paramètre de modèle.

Solution :

Une solution élégante exploite une combinaison d'itérateurs et de modèles. Voici comment cela fonctionne :

Nous définissons deux utilitaires d'assistance :

  • genseq_t génère une séquence d'entiers [0, 1, ..., n-1 ].
  • repeat crée un tableau en répétant une valeur donnée le nombre de fois spécifié.

En utilisant ces utilitaires, nous pouvons initialiser le std::array dans la fonction de modèle f comme suit :

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = repeat(value, genseq_t<N>{});
}</code>

Détails de mise en œuvre :

  • genseq_t : Il utilise des modèles variadiques pour créer un séquence d'entiers jusqu'à n.
  • repeat: Cette fonction décompresse la séquence générée par genseq_t et construit le tableau en appelant T(N, valeur) pour chaque entier de la séquence.

Exemple :

Considérons une initialisation avec une valeur comme entier et n comme paramètre de modèle :

<code class="cpp">void f(int value)
{
    std::array<T, 5> items = repeat(value, genseq_t<5>{});
}</code>

Ici, les éléments seront initialisé avec la valeur répétée cinq fois : {value, value, value, value, value}.

Avantages :

Cette approche est plus concise, surtout lorsque n est grand. Cela élimine également le besoin de répéter manuellement la valeur.

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