Maison  >  Article  >  développement back-end  >  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
Patricia Arquetteoriginal
2024-10-30 09:53:27522parcourir

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>

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>

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>

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!

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