Le modèle de modèle curieusement récurrent (CRTP) permet le polymorphisme statique en C, mais cela devient difficile lorsque l'on vise à modifier les types de retour de fonction en fonction du type dérivé. Bien que CRTP puisse généralement déduire le type dérivé, le code suivant rencontre des problèmes de compilation dans MSVC 2010 :
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; };
Cette erreur se produit car la classe dérivée est incomplète lorsqu'elle est utilisée comme paramètre de modèle pour la classe de base dans la base de données. liste de classe. Pour résoudre ce problème, une solution de contournement courante consiste à utiliser un modèle de classe de traits :
// Declare the base_traits class template template <typename derived_t> struct base_traits; // Define the base class template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; }; // Define the derived class template <typename T> struct derived : public base<derived<T>> { typedef typename base_traits<derived<T>>::value_type value_type; }; // Specialization of base_traits for derived template <typename T> struct base_traits<derived<T>> { typedef T value_type; };
En spécialisant le modèle base_traits pour les types dérivés souhaités, vous pouvez définir les membres requis, y compris les types de retour personnalisés pour des fonctions telles que foo (). Cette technique permet un polymorphisme statique avec plus de flexibilité dans les types de retour tout en évitant les erreurs de compilation.
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!