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