Maison > développement back-end > C++ > Comment initialiser élégamment `std::array` avec des types constructibles autres que ceux par défaut en C ?

Comment initialiser élégamment `std::array` avec des types constructibles autres que ceux par défaut en C ?

Susan Sarandon
Libérer: 2024-10-27 20:17:01
original
1034 Les gens l'ont consulté

 How to Elegantly Initialize `std::array` with Non-Default Constructible Types in C  ?

Initialisation élégante de std::array avec des types constructibles autres que ceux par défaut

Dans le domaine du C, std::array offre un moyen pratique de gérer des tableaux de taille fixe. Cependant, l'initialisation des éléments dans un tableau pose un défi lorsqu'il s'agit de types dépourvus de constructeurs par défaut.

Considérez l'extrait de code suivant :

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = {value, value, value, value, value};
}</code>
Copier après la connexion

Bien que simple, répéter manuellement la valeur devient fastidieux car N augmente. Pour résoudre ce problème, une approche plus élégante consiste à exploiter les liaisons structurées et les modèles variadiques de C 17.

Utilisation des générateurs de séquence et de la fonction de répétition

La clé de cet élégant La solution réside dans la génération d'un seq<0,1,2,3,...N-1> en utilisant le genseq_t<> générateur. Avec ce type de séquence, nous pouvons définir une fonction de répétition qui prend une valeur et la séquence générée comme paramètres et renvoie un std::array rempli avec la valeur répétée.

Exemple de mise en œuvre

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // genseq_t<N> represents seq<0,1,...N-1>
    std::array<T, N> items = repeat(value, genseq_t<N>{});
}</code>
Copier après la connexion

Détails du modèle

  • genseq_t< ;N>::type représente le type de séquence qui s'étend de 0 à N-1.
  • repeat(value, seq) est évalué à un std::array avec chaque élément initialisé à la valeur.

Cette technique permet une initialisation concise et élégante de std::array même lorsque T n'a pas de constructeur par défaut.

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