Heim > Backend-Entwicklung > C++ > Hauptteil

Wie erreicht man typsicheren dynamischen Versand mit virtuellen Vorlagenmethoden in C?

Barbara Streisand
Freigeben: 2024-10-26 08:44:30
Original
250 Leute haben es durchsucht

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

Typpolymorphismus in C: Methoden virtueller Vorlagen

Bei der C-Programmierung kann die Kombination virtueller Elementfunktionen mit Klassenvorlagen eine Herausforderung darstellen. Diese Situation entsteht, wenn Sie Methoden basierend auf Laufzeittypinformationen dynamisch versenden möchten, aber dennoch typsicheres Verhalten beibehalten möchten.

Das Problem

Betrachten Sie die folgende abstrakte Klasse und seine abgeleitete Implementierung:

<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>
Nach dem Login kopieren

Die Absicht hier ist, dass der Aufruf von setData("foodouble", data) das von foodouble identifizierte Double auf den Wert von data setzen würde.

Mögliche Lösungen

1. Statischen Polymorphismus entfernen:

Ein Ansatz besteht darin, statischen Polymorphismus (Vorlagen) zu eliminieren und einen generischen Speicher für Schlüssel-Wert-Paare einzuführen:

<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>
Nach dem Login kopieren

Diese Lösung bietet dynamischen Polymorphismus ohne Notwendigkeit einer Vorlagenspezialisierung.

2. Dynamischen Polymorphismus entfernen:

Eine andere Option besteht darin, den Laufzeitpolymorphismus beizubehalten, aber den statischen Polymorphismus zu entfernen:

<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>
Nach dem Login kopieren

Hier ermöglicht der Typ Erasure mit boost::any das Versenden an Nicht-Vorlagen Methoden ohne Einbußen bei der Typensicherheit.

Das obige ist der detaillierte Inhalt vonWie erreicht man typsicheren dynamischen Versand mit virtuellen Vorlagenmethoden in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!