Méthode de modèle virtuel C
En C, il peut être difficile de combiner le polymorphisme temporel statique (modèles) avec le polymorphisme d'exécution. Ceci est évident dans la classe abstraite suivante :
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data); template <class T> virtual T getData(std::string id); };</code>
Cette classe vise à définir et à récupérer des données d'un type spécifié en fonction d'un identifiant unique. Cependant, un problème survient lorsque l'on tente d'appeler la fonction générique setData avec un type spécifique, tel que setData
Le langage interdit cette construction car le compilateur devrait dynamiquement envoyer un nombre infini d’instanciations de modèles possibles. Pour résoudre ce problème, plusieurs approches sont possibles :
Suppression du polymorphisme statique :
<code class="cpp">class AbstractComputation { public: template <typename T> void setData( std::string const & id, T value ) { m_store.setData( id, value ); } template <typename T> T getData( std::string const & id ) const { return m_store.getData<T>( id ); } protected: ValueStore m_store; };</code>
Suppression du polymorphisme dynamique :
<code class="cpp">class AbstractComputation { public: template <typename T> void setData( std::string const & id, T value ) { setDataImpl( id, boost::any( value ) ); } template <typename T> T getData( std::string const & id ) const { boost::any res = getDataImpl( id ); return boost::any_cast<T>( res ); } protected: virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0; virtual boost::any getDataImpl( std::string const & id ) const = 0; };</code>
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!