Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man typsicheren dynamischen Versand mit virtuellen Vorlagenmethoden in C?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 08:44:30251Durchsuche

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>

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>

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>

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!

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