Maison > développement back-end > C++ > le corps du texte

Comment initialiser élégamment std::array constructible non par défaut avec la métaprogrammation de modèles ?

Linda Hamilton
Libérer: 2024-10-28 04:59:01
original
762 Les gens l'ont consulté

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

Initialiser std::array constructible autre que par défaut avec élégance

Lorsque vous travaillez avec des types constructibles autres que ceux par défaut en C, l'initialisation d'un std::array peut être difficile, en particulier lorsque la taille du tableau est déterminée par un paramètre de modèle.

Pour résoudre ce problème, nous introduisons une approche sophistiquée qui exploite les concepts de type de séquence et de générateur :

Sequence-Type seq

Nous définissons un type de séquence appelé seq à l'aide d'une métafonction modèle, qui représente une séquence d'entiers séquentiels.

<code class="cpp">template<int ... N>
struct seq
{
   using type = seq<N...>;
   static const std::size_t size = sizeof ... (N);
   template<int I>
   struct push_back : seq<N..., I> {};
};</code>
Copier après la connexion

Générateur genseq

En utilisant cette séquence, nous construisons un générateur genseq qui génère séquences de longueur croissante :

<code class="cpp">template<int N>
struct genseq : genseq<N-1>::type::template push_back<N-1> {};

template<>
struct genseq<0> : seq<> {};

template<int N>
using genseq_t = typename genseq<N>::type;</code>
Copier après la connexion

Fonction repeat()

La séquence étant en place, nous définissons une fonction repeat() pour créer des tableaux initialisés avec la même valeur :

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)> 
{
   //unpack N, repeating `value` sizeof...(N) times
   //note that (X, value) evaluates to value
   return {(N, value)...}; 
}</code>
Copier après la connexion

Utilisation

Pour initialiser un std::array de type constructible non par défaut, nous appelons simplement repeat() avec la valeur souhaitée et la séquence générée par genseq_t:

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

Cette solution garantit une initialisation élégante et efficace de std::array, éliminant efficacement le besoin d'une répétition manuelle fastidieuse lorsque n est un paramètre de modèle volumineux.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!