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

Comment pouvons-nous implémenter la sélection de modèles basée sur l'absence d'une fonction dans la métaprogrammation C ?

Mary-Kate Olsen
Libérer: 2024-11-09 20:36:02
original
312 Les gens l'ont consulté

How Can We Implement Template Selection Based on the Absence of a Function in C   Metaprogramming?

Métaprogrammation : sélection de modèles basée sur la surcharge de fonctions

Dans la métaprogrammation C, la définition de fonctions de modèle de manière conditionnelle en fonction des propriétés de type est une technique courante. Cependant, dans certains cas, il peut être difficile de définir le scénario inverse, où un modèle est sélectionné en fonction de l'absence d'une fonction particulière.

Plus précisément, dans l'exemple fourni, le but est de définir un modèle fonction stringify qui sélectionne entre deux implémentations :

  • Si std::to_string est défini pour le type donné, utilisez to_string(t) pour convertir la valeur en un string.
  • Si std::to_string n'est pas défini pour le type, utilisez ostringstream() << t.

Le problème se pose lorsqu'on essaie d'exprimer cette dernière condition. La tentative infructueuse suivante tente d'utiliser des modèles activate_if imbriqués pour vérifier si to_string n'est pas défini :

template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
    return static_cast<ostringstream&>(ostringstream() << t).str();
}
Copier après la connexion

Pour résoudre ce problème, nous pouvons utiliser le trait de type void_t de Walter Brown :

template <typename...>
using void_t = void;<p> En utilisant cela, nous pouvons définir le trait has_to_string comme suit :</p>
<pre class="brush:php;toolbar:false">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

Maintenant, le modèle stringify peut être défini en utilisant la spécialisation de modèle conditionnelle basée sur le trait has_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();
}
Copier après la connexion

Cette solution sélectionne efficacement l'implémentation appropriée de stringify selon que std::to_string est défini pour le type donné.

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