Heim > Backend-Entwicklung > C++ > Hauptteil

Wie implementiert man virtuelle Vorlagenmethoden in C?

Barbara Streisand
Freigeben: 2024-10-26 09:18:30
Original
432 Leute haben es durchsucht

How to Implement Virtual Template Methods in C  ?

C Virtual Template Method

Das vorgestellte Szenario umfasst eine abstrakte Klasse mit virtuellen Template-Methoden, setData und getData, die zum dynamischen Festlegen und Abrufen gedacht sind Daten verschiedener Art basierend auf einer bereitgestellten Kennung. Wie die Frage jedoch einräumt, wird ein solches Konstrukt in C nicht direkt unterstützt.

Um diese Einschränkung zu beheben, gibt es zwei Hauptansätze:

Statischen Polymorphismus entfernen

Eine Möglichkeit besteht darin, statischen Polymorphismus (Vorlagen) zu entfernen und einen Zwischenspeichermechanismus einzuführen. Die AbstractComputation-Klasse könnte einen ValueStore ohne Vorlage definieren, der für das Speichern und Abrufen von Daten basierend auf Bezeichnern verantwortlich ist:

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

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);
  }

private:
  ValueStore m_store;
};</code>
Nach dem Login kopieren

Abgeleitete Klassen können dann direkt auf den ValueStore zugreifen, ohne dass Laufzeitpolymorphismus erforderlich ist.

Laufzeitpolymorphismus entfernen

Alternativ kann der Laufzeitpolymorphismus beibehalten und gleichzeitig der statische Polymorphismus entfernt werden. Dazu gehört die Typlöschung der Basisklasse:

<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

boost::any ist ein Typ, der Werte jeden Typs speichern kann und einen sicheren Abruf der Daten ermöglicht. Die Typlöschung erfolgt durch Übergabe von boost::any-Objekten als Argumente an die virtuellen Methoden, die in den abgeleiteten Klassen implementiert werden müssen.

Das obige ist der detaillierte Inhalt vonWie implementiert man virtuelle 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!