Maison >développement back-end >C++ >Comment obtenir une répartition dynamique de type sécurisé avec des méthodes de modèles virtuels en C ?

Comment obtenir une répartition dynamique de type sécurisé avec des méthodes de modèles virtuels en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 08:44:30318parcourir

How to Achieve Type-Safe Dynamic Dispatch with Virtual Template Methods in C  ?

Polymorphisme de type en C : méthodes de modèles virtuels

En programmation C, combiner des fonctions de membre virtuel avec des modèles de classe peut être un défi. Cette situation se produit lorsque vous souhaitez distribuer dynamiquement des méthodes basées sur des informations de type d'exécution, tout en conservant un comportement sécurisé.

Le problème

Considérez la classe abstraite suivante et son implémentation dérivée :

<code class="cpp">class AbstractComputation {
public:
    template <class T> virtual void setData(std::string id, T data) = 0;
    template <class T> virtual T getData(std::string id) = 0;
};

class Computation : public AbstractComputation {
public:
    template <class T> void setData(std::string id, T data);
    template <class T> T getData(std::string id, T data);
};</code>

L'intention ici est que l'appel de setData("foodouble", data) définirait le double identifié par foodouble à la valeur de data.

Solutions possibles

1. Supprimer le polymorphisme statique :

Une approche consiste à éliminer le polymorphisme statique (modèles) et à introduire un magasin générique pour les paires clé-valeur :

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

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>

Cette solution fournit un polymorphisme dynamique sans le besoin de spécialisation en modèles.

2. Supprimer le polymorphisme dynamique :

Une autre option consiste à conserver le polymorphisme d'exécution mais à supprimer le polymorphisme statique :

<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>

Ici, tapez erasure à l'aide de boost::any permet la distribution vers des fichiers non modélisés. méthodes sans sacrifier la sécurité des types.

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