Maison  >  Article  >  développement back-end  >  Comment SFINAE peut-il être utilisé pour créer un trait de type permettant d'identifier les conteneurs STL en C ?

Comment SFINAE peut-il être utilisé pour créer un trait de type permettant d'identifier les conteneurs STL en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 12:00:29140parcourir

How can SFINAE be used to create a type trait for identifying STL containers in C  ?

Traits de type pour identifier les conteneurs STL

En C, un trait de type peut être utilisé pour déterminer les propriétés d'un type donné. Un besoin courant est de vérifier si un type représente un conteneur, tel qu'un vecteur, un ensemble ou une carte.

Implémentation personnalisée pour le vecteur

Pour commencer, commençons par envisagez de créer un trait de type spécifiquement pour les vecteurs. Cependant, la tentative de compilation suivante échoue :

<code class="cpp">template<class T, typename Enable = void>
struct is_vector {
  static bool const value = false;
};

template<class T, class U>
struct is_vector<T, typename boost::enable_if<boost::is_same<T, std::vector<U>> >::type> {
  static bool const value = true;
};</code>

Ce code génère l'erreur "paramètres de modèle non utilisés dans la spécialisation partielle : U." En effet, le paramètre de modèle U n'est pas utilisé dans la spécialisation partielle.

Solution basée sur SFINAE pour les conteneurs

Une approche plus générale consiste à utiliser l'échec de substitution n'est pas Une erreur (SFINAE) pour créer un trait de type qui fonctionne pour une large gamme de conteneurs STL. Voici un exemple :

<code class="cpp">template<typename T, typename _ = void>
struct is_container : std::false_type {};

template<typename... Ts>
struct is_container_helper {};

template<typename T>
struct is_container<
        T,
        std::conditional_t<
            false,
            is_container_helper<
                typename T::value_type,
                typename T::size_type,
                typename T::iterator,
                typename T::const_iterator,
                decltype(std::declval<T>().size()),
                decltype(std::declval<T>().begin()),
                decltype(std::declval<T>().end()),
                decltype(std::declval<T>().cbegin()),
                decltype(std::declval<T>().cend())
                >,
            void
            >
        > : public std::true_type {};</code>

Ce trait de type vérifie la présence de membres et de méthodes essentiels communs à la plupart des conteneurs STL. Si tous ces membres sont présents, is_container est évalué à vrai ; sinon, il est évalué comme faux.

Remarque : Pour garantir que le trait de type identifie uniquement les conteneurs STL, vous devrez peut-être ajuster les contrôles pour vérifier les exigences spécifiques communes aux conteneurs STL.

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