Métaprogrammation : spécialisation basée sur la résolution de surcharge
En métaprogrammation, il est courant de définir des modèles basés sur des propriétés de type. Cependant, un défi se pose lorsque l'on essaie de choisir entre deux définitions de modèle selon qu'une surcharge spécifique est définie ou non pour un type donné.
Walter Brown introduit un type utile, void_t, qui renvoie void si aucun argument de modèle n'est fourni. . En nous basant sur ce concept, nous pouvons définir un trait de type pour vérifier l'existence de la surcharge std::to_string pour un type donné :
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 { };
Avec ce trait de type, nous pouvons désormais facilement écrire un modèle qui se spécialise en fonction de la résolution de surcharge pour std::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(); }
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!