Maison > développement back-end > C++ > Comment implémenter efficacement « make_integer_sequence » de C 14 et éviter les erreurs de compilation ?

Comment implémenter efficacement « make_integer_sequence » de C 14 et éviter les erreurs de compilation ?

Patricia Arquette
Libérer: 2024-12-28 02:10:14
original
611 Les gens l'ont consulté

How to Efficiently Implement C  14's `make_integer_sequence` and Avoid Compilation Errors?

Implémentation de C 14 make_integer_sequence et analyse des erreurs

Introduction

Le modèle d'alias C 14 make_integer_sequence simplifie la création du modèle de classe séquence_entière. Cet article traite d'une implémentation utilisant des structures d'assistance et des macros et explore une erreur rencontrée lors de la compilation.

Implémentation de make_integer_sequence

Pour implémenter make_integer_sequence, une structure d'assistance make_helper est définie :

template< class T, T N, T... I >
struct make_helper
{
   typedef typename mpl::if_< T(0) == N,  
                  mpl::identity< integer_sequence<T,I...> >,
                  make_helper< T, N-1, N-1,I...> 
               >::type;
};
Copier après la connexion

L'implémentation réelle de make_integer_sequence devient alors :

template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Copier après la connexion

Analyse des erreurs

La compilation avec GCC 4.8.0 a initialement échoué en raison d'un épuisement de la mémoire virtuelle. Cette erreur s'est produite lorsque la macro GEN a été modifiée pour générer des séquences plus grandes. La raison en est que l'implémentation nécessite une instanciation approfondie du modèle, ce qui peut épuiser la mémoire disponible.

Diminution de l'instanciation de la profondeur du modèle

Pour diminuer l'instanciation approfondie du modèle, soit le L'option du compilateur -ftemplate-degree peut être utilisée pour augmenter la profondeur maximale ou une implémentation différente avec une complexité logarithmique peut être utilisé.

Implémentation de Log N

L'implémentation de Log N fournie utilise une approche récursive et est plus efficace :

template<unsigned...> struct seq{ using type = seq; };

template<class S1, class S2> struct concat;

template<unsigned... I1, unsigned... I2>
struct concat<seq<I1...>, seq<I2...>>
  : seq<I1..., (sizeof...(I1)+I2)...>{};

template<class S1, class S2>
using Concat = Invoke<concat<S1, S2>>;

template<unsigned N> struct gen_seq;
template<unsigned N> using GenSeq = Invoke<gen_seq<N>>;

template<unsigned N>
struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{};

template<> struct gen_seq<0> : seq<>{};
template<> struct gen_seq<1> : seq<0>{};
Copier après la connexion

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