Métaprogrammation : sélection de modèles basée sur la surcharge de fonctions
Dans la métaprogrammation C, la définition de fonctions de modèle de manière conditionnelle en fonction des propriétés de type est une technique courante. Cependant, dans certains cas, il peut être difficile de définir le scénario inverse, où un modèle est sélectionné en fonction de l'absence d'une fonction particulière.
Plus précisément, dans l'exemple fourni, le but est de définir un modèle fonction stringify qui sélectionne entre deux implémentations :
Le problème se pose lorsqu'on essaie d'exprimer cette dernière condition. La tentative infructueuse suivante tente d'utiliser des modèles activate_if imbriqués pour vérifier si to_string n'est pas défini :
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Pour résoudre ce problème, nous pouvons utiliser le trait de type void_t de Walter Brown :
template <typename...> using void_t = void;<p> En utilisant cela, nous pouvons définir le trait has_to_string comme suit :</p> <pre class="brush:php;toolbar:false">template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))> > : std::true_type { };
Maintenant, le modèle stringify peut être défini en utilisant la spécialisation de modèle conditionnelle basée sur le trait has_to_string :
template<typename T> enable_if_t<has_to_string<T>::value, string> stringify(T t){ return std::to_string(t); } template<typename T> enable_if_t<!has_to_string<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Cette solution sélectionne efficacement l'implémentation appropriée de stringify selon que std::to_string est défini pour le type donné.
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!