Maison  >  Article  >  développement back-end  >  Comment réaliser le polymorphisme avec des méthodes de modèles virtuels en C ?

Comment réaliser le polymorphisme avec des méthodes de modèles virtuels en C ?

DDD
DDDoriginal
2024-10-27 06:53:03714parcourir

How can you achieve polymorphism with virtual template methods in C  ?

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("foodouble", data).

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 :

  • Éliminez le polymorphisme statique en introduisant un type distinct pour stocker la valeur-clé cartographies. Le modèle peut ensuite résoudre ce problème au niveau de base, sans avoir besoin de polymorphisme :
<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 :

  • Conserver le temps d'exécution polymorphisme mais éliminez le polymorphisme statique par effacement de type :
  • Utilisez boost::any, qui fournit l'effacement de type, pour stocker des données de tout type :
<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!

Déclaration:
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