Maison >développement back-end >C++ >Comment les traits C peuvent-ils résoudre les problèmes de compilation avec le polymorphisme statique et les typedefs dans le modèle de modèle curieusement récurrent ?
Polymorphisme statique et typesdefs en C
Curieusement récurrents (CRTP) est une technique en C permettant d'obtenir un polymorphisme statique. Cependant, lorsque vous tentez de généraliser ce modèle pour modifier les types de retour en fonction des types dérivés, le code peut ne pas se compiler, comme rencontré par un utilisateur utilisant MSVC 2010.
Problème :
Le code suivant, destiné à autoriser différents types de retour dans la classe dérivée, ne parvient pas à se compiler :
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); } };
L'erreur rencontrée est "n'est pas membre de 'derived'.'". Cela se produit car le type dérivé est incomplet lorsqu'il est utilisé comme argument de modèle pour sa classe de base.
Une solution de contournement courante consiste à utiliser un modèle de classe de traits. Dans cette approche, un modèle de classe base_traits est défini pour encapsuler à la fois les types et les fonctions de la classe dérivée. La classe de base d'origine est modifiée pour utiliser ces traits.En spécialisant la classe base_traits pour chaque type utilisé dans l'argument du modèle dérivé, les types et fonctions souhaités sont accessibles via les traits, permettant à la fois statique polymorphisme et types de retour dynamiques.
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!