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

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

DDD
DDDOriginal
2024-10-27 06:53:03714Durchsuche

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>

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>

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>

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!

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