Métaprogrammation : échec de la définition de fonction C en tant que définition de fonction distincte
En C, il est possible de définir des métafonctions basées sur des traits de type. Par exemple, on peut définir un modèle pour convertir une valeur en chaîne selon que le type de la valeur est arithmétique :
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){ return to_string(t); } template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
Cette approche repose cependant sur la propriété is_arithmetic du type. Une approche plus souhaitable serait basée sur la disponibilité de la fonction std::to_string pour le type. Cependant, il est difficile d'exprimer l'exigence suivante en tant que trait de type :
"Si std::to_string est défini pour le type, utilisez-le."
Il est possible de déclarer les critères pour std ::to_string disponibilité :
template<typename T> decltype(to_string(T{})) stringify(T t){ return to_string(t); }
Mais on ne sait pas comment construire les critères opposés.
Utilisation Le trait de type void_t de Walter Brown, il est facile de définir le trait de type souhaité :
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 évalue si la fonction std::to_string est définie pour un type donné, permettant une sélection de modèle plus flexible en fonction de la fonction. disponibilité.
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!