Initialisation élégante de std::array
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
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
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!