Maison > Article > développement back-end > Voici quelques titres basés sur des questions qui correspondent au contenu de votre article : * Méthodes de modèles virtuels C : comment obtenir une spécialisation de modèles avec le polymorphisme d'exécution ? * Modèle C et environnement d'exécution
Méthodes de modèles virtuels C : s'attaquer au polymorphisme des modèles et de l'exécution
En C, confrontés au dilemme de combiner la spécialisation des modèles avec le polymorphisme d'exécution, les développeurs rencontrer une pierre d'achoppement. Cette complexité survient lorsque l'on tente d'implémenter des méthodes virtuelles dans une classe abstraite qui acceptent les paramètres de modèle. Le défi vient du grand nombre de types potentiels instanciant la fonction de modèle, entravant ainsi la capacité du compilateur à répartir dynamiquement les appels.
Pour surmonter cette limitation, plusieurs approches peuvent être adoptées. Une option consiste à supprimer le polymorphisme dynamique et à utiliser un type non dérivé pour stocker les paires clé-valeur. Le modèle de classe de base peut ensuite être utilisé pour résoudre ces mappages :
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { m_store.setData(id, value); } template <typename T> T getData(const std::string& id) const { return m_store.getData<T>(id); } protected: ValueStore m_store; };</code>
Vous pouvez également préserver le polymorphisme d'exécution tout en éliminant les paramètres du modèle en utilisant l'effacement de type. L'utilisation de boost::any, par exemple, permet la création de fonctions concrètes, non modélisées, qui acceptent des arguments effacés par type :
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { setDataImpl(id, boost::any(value)); } template <typename T> T getData(const std::string& id) const { boost::any res = getDataImpl(id); return boost::any_cast<T>(res); } protected: virtual void setDataImpl(const std::string& id, const boost::any& value) = 0; virtual boost::any getDataImpl(const std::string& id) const = 0; };</code>
L'effacement de type, essentiellement, permet à boost::any de stocker des données de tout type en coulisse tout en permettant une récupération de données sécurisée.
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!