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; };
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;
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>{};
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!