Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-09 10:48:02
original
780 Les gens l'ont consulté

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();
}
Copier après la connexion

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);
}
Copier après la connexion

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 { };
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal