Maison > développement back-end > C++ > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-26 12:00:29
original
139 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!