Maison >développement back-end >C++ >Comment appliquer l'uniformité des types dans les fonctions variadiques ?
Assurer l'uniformité des types d'arguments dans les fonctions variadiques
Dans ce scénario, nous visons à créer une fonction qui peut accepter un nombre variable d'arguments, mais assurez-vous que tous les arguments sont du même type. Nous cherchons à y parvenir sans recourir à des structures de données supplémentaires telles que des tableaux ou des vecteurs.
Fonctions variadiques
Les fonctions variadiques en elles-mêmes ne fournissent pas de sécurité de type pour leurs arguments. Pour garantir l'uniformité du type, envisagez d'utiliser des fonctions de modèle variadiques.
Fonctions de modèle variadiques
Une fonction de modèle variadique peut être définie comme suit :
template<typename... Args> return_type function_name(Args...);
Dans ce modèle, Args... représente le nombre variable d'arguments pouvant être transmis au function.
Application de la vérification de type
Pour garantir que tous les arguments sont du même type, nous pouvons utiliser SFINAE (Substitution Failure Is Not An Error). SFINAE nous permet de créer un modèle qui détecte si une condition donnée est vraie ou fausse lors de la compilation.
Voici un exemple :
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 ce modèle, f() ne sera autorisé que pour accepter les arguments convertibles en type ToType (qui représente le type d'argument souhaité). Cette configuration rejette tous les arguments qui ne sont pas convertibles en ToType.
Solution de cas d'utilisation
Pour votre cas d'utilisation spécifique, vous pouvez utiliser ce qui suit :
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
Ce modèle convertit les arguments de la variable en un tableau de type std::array
Combinaison avec SFINAE
En combinant cette approche avec la technique SFINAE décrite précédemment, vous pouvez créer un modèle qui rejette tous les arguments qui ne sont pas convertibles en Maiden.
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!