Maison >développement back-end >C++ >Comment appliquer l'uniformité des types dans les fonctions variadiques ?

Comment appliquer l'uniformité des types dans les fonctions variadiques ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 04:30:02321parcourir

How to Enforce Type Uniformity in Variadic Functions?

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. Vous pouvez ensuite utiliser toutes les méthodes disponibles pour convertir ce tableau en votre type dragon_list_t.

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!

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