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 ?
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
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!