Maison  >  Article  >  développement back-end  >  Comment définir un trait de type pour la disponibilité des fonctions en C ?

Comment définir un trait de type pour la disponibilité des fonctions en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 10:48:02781parcourir

How to Define a Type Trait for Function Availability in C  ?

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&amp;>(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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn