Maison > développement back-end > C++ > le corps du texte

Comment implémenter des méthodes de modèles virtuels en C ?

Barbara Streisand
Libérer: 2024-10-26 09:18:30
original
432 Les gens l'ont consulté

How to Implement Virtual Template Methods in C  ?

Méthode de modèle virtuel C

Le scénario présenté implique une classe abstraite avec des méthodes de modèle virtuel, setData et getData, destinées à définir et récupérer dynamiquement données de différents types basées sur un identifiant fourni. Cependant, comme le reconnaît la question, une telle construction n'est pas directement prise en charge en C .

Pour remédier à cette limitation, il existe deux approches principales :

Supprimer le polymorphisme statique

Une option consiste à supprimer le polymorphisme statique (modèles) et à introduire un mécanisme de stockage intermédiaire. La classe AbstractComputation pourrait définir un ValueStore non basé sur un modèle, chargé de stocker et de récupérer les données en fonction des identifiants :

<code class="cpp">class ValueStore {
public:
  template <typename T>
  void setData(std::string const &id, T value) {...}
  
  template <typename T>
  T getData(std::string const &id) {...}
};

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);
  }

private:
  ValueStore m_store;
};</code>
Copier après la connexion

Les classes dérivées peuvent alors accéder directement au ValueStore sans avoir besoin de polymorphisme d'exécution.

Supprimer le polymorphisme d'exécution

Alternativement, le polymorphisme d'exécution peut être conservé tout en supprimant le polymorphisme statique. Cela implique d'effectuer un effacement de type sur la classe de base :

<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>
Copier après la connexion

boost::any est un type qui peut stocker des valeurs de n'importe quel type et permet une récupération en toute sécurité des données. L'effacement de type est effectué en passant des objets boost::any comme arguments aux méthodes virtuelles, qui doivent être implémentées dans les classes dérivées.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!