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

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
Mary-Kate Olsenoriginal
2024-11-09 20:36:02397parcourir

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();
}

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 { };

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();
}

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!

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