Maison > développement back-end > C++ > Comment initialiser `std::array` pour les types constructibles non par défaut avec élégance ?

Comment initialiser `std::array` pour les types constructibles non par défaut avec élégance ?

Patricia Arquette
Libérer: 2024-10-30 09:53:27
original
601 Les gens l'ont consulté

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

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

Dans ce contexte, l'initialisation d'un std::array peut être un défi lorsque le type contenu (T) n'a pas de constructeur par défaut. Une solution courante consiste à répéter manuellement la valeur pour remplir le tableau, un processus fastidieux et sujet aux erreurs pour les grandes valeurs n.

Heureusement, il existe une approche plus élégante utilisant une combinaison de types de séquence et une fonction de répétition personnalisée. Considérons le code suivant :

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

Le genseq_t type représente une séquence de nombres de 0 à N-1, et la fonction de répétition prend une valeur et une séquence, renvoyant un tableau rempli de cette valeur.

L'implémentation de la fonction de répétition implique de décompresser la séquence et de répéter la valeur pour chaque élément en utilisant une syntaxe concise :

<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
    return {(N, value)...};
}</code>
Copier après la connexion

Le type genseq_t est défini de manière récursive à l'aide d'une opération push_back pour créer une séquence :

<code class="cpp">template<int N>
struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>
Copier après la connexion

La séquence personnalisée et la fonction de répétition offrent une et solution élégante pour initialiser std::array avec des types constructibles autres que ceux 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