Heim > Backend-Entwicklung > C++ > Wie kann man mit virtuellen Template-Methoden in C Polymorphismus erreichen?

Wie kann man mit virtuellen Template-Methoden in C Polymorphismus erreichen?

DDD
Freigeben: 2024-10-27 06:53:03
Original
814 Leute haben es durchsucht

How can you achieve polymorphism with virtual template methods in C  ?

C Virtual Template-Methode

In C kann es schwierig sein, statischen Zeitpolymorphismus (Vorlagen) mit Laufzeitpolymorphismus zu kombinieren. Dies wird in der folgenden abstrakten Klasse deutlich:

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

Diese Klasse zielt darauf ab, Daten eines bestimmten Typs basierend auf einer eindeutigen Kennung festzulegen und abzurufen. Es tritt jedoch ein Problem auf, wenn versucht wird, die generische setData-Funktion mit einem bestimmten Typ aufzurufen, beispielsweise setData("foodouble", data).

Die Sprache verbietet dieses Konstrukt, da der Compiler dies dynamisch tun müsste Senden Sie eine unendliche Anzahl möglicher Vorlageninstanziierungen. Um dieses Problem zu lösen, sind mehrere Ansätze möglich:

Statischen Polymorphismus entfernen:

  • Beseitigen Sie den statischen Polymorphismus, indem Sie einen separaten Typ zum Speichern des Schlüsselwerts einführen Zuordnungen. Die Vorlage kann dies dann auf der Basisebene auflösen, ohne dass Polymorphismus erforderlich ist:
<code class="cpp">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

Dynamischen Polymorphismus entfernen:

  • Laufzeit beibehalten Polymorphismus, aber eliminieren Sie statischen Polymorphismus durch Typlöschung:
  • Verwenden Sie boost::any, das Typlöschung ermöglicht, um Daten jedes Typs zu speichern:
<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

Das obige ist der detaillierte Inhalt vonWie kann man mit virtuellen Template-Methoden in C Polymorphismus erreichen?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage