Métaprogrammation : critères alternatifs de sélection de modèles pour la définition de fonctions
Cette question explore le concept de définition d'un modèle basé sur la capacité d'un type à être converti à une chaîne. Le code original utilise le trait de type is_arithmetic, mais il est suggéré d'utiliser à la place un critère qui évalue si to_string est défini pour le type.
Cependant, le contraire de ce critère, déterminant quand to_string n'est pas défini, prouve stimulant. Le code suivant échoue :
template<typename T> enable_if_t<decltype(to_string(T{})::value, string> (T t){ // ... }
Pour résoudre ce problème, la réponse propose d'utiliser le trait de type void_t de Walter Brown, qui permet la création des éléments suivants :
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 { };
Ce trait de type évalue efficacement si to_string est défini pour un type donné, fournissant ainsi un critère de sélection de modèle alternatif qui s'aligne plus précisément sur l'intention d'origine.
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!