Lors de la définition de fonctions avec des arguments variadiques, il est souvent souhaitable de s'assurer que tous les arguments fournis sont du même type . Cela permet de maintenir la sécurité des types et d'éviter les erreurs potentielles.
Les fonctions variadiques elles-mêmes n'appliquent pas la sécurité des types, laissant le programmeur responsable de la vérification explicite. Cependant, une combinaison de techniques peut être utilisée pour mettre en œuvre cette exigence de manière efficace.
Option 1 : approche de conversion ultérieure
Une méthode consiste à accepter les arguments comme variadiques et effectuer la conversion de type plus tard. Par exemple, si vous connaissez les étapes nécessaires pour convertir de std::array en dragon_list_t, la fonction de modèle suivante peut être utilisée :
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // Here be dragons }
Option 2 : approche de rejet précoce basée sur SFINAE
Une autre option consiste à utiliser l'échec de substitution n'est pas une erreur (SFINAE) pour effectuer une vérification de type au niveau de l'interface de fonction. Cette technique permet une résolution de surcharge pour rejeter dès le début les types d'arguments non valides :
template<typename R, typename... Args> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
Dans cet exemple, la fonction f sera instanciée uniquement lorsque tous les arguments fournis sont convertibles en type ToType.
Conclusion
En utilisant soit l'approche de conversion ultérieure, soit l'approche de rejet anticipé basée sur SFINAE, les développeurs peuvent spécifier un type pour tous les arguments transmis aux fonctions variadiques ou aux fonctions de modèle variadiques sans avoir recours à à des structures supplémentaires ou des frais généraux.
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!