"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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++ ?

Publié le 2024-11-08
Parcourir:145

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. Cela est évident dans la classe abstraite suivante :

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};

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 clé-valeur cartographies. Le modèle peut ensuite résoudre ce problème au niveau de base, sans avoir besoin de polymorphisme :
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

Suppression du polymorphisme dynamique :

  • Conserver le polymorphisme d'exécution mais éliminer le polymorphisme statique par effacement de type :
  • Utiliser boost::any, qui permet l'effacement de type, pour stocker des données de tout type :
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      setDataImpl( id, boost::any( value ) );
   }
   template 
   T getData( std::string const & id ) const {
      boost::any res = getDataImpl( id );
      return boost::any_cast( res );
   }
protected:
   virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
   virtual boost::any getDataImpl( std::string const & id ) const = 0;
};
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3