Methoden virtueller C-Vorlagen: Bekämpfung von Vorlagen- und Laufzeitpolymorphismus
In C stehen Entwickler vor dem Dilemma, Vorlagenspezialisierung mit Laufzeitpolymorphismus zu kombinieren auf einen Stolperstein stoßen. Diese Komplexität entsteht, wenn versucht wird, virtuelle Methoden innerhalb einer abstrakten Klasse zu implementieren, die Vorlagenparameter akzeptiert. Die Herausforderung ergibt sich aus der schieren Anzahl potenzieller Typen, die die Vorlagenfunktion instanziieren und somit die Fähigkeit des Compilers behindern, Aufrufe dynamisch zu versenden.
Um diese Einschränkung zu überwinden, können mehrere Ansätze verfolgt werden. Eine Möglichkeit besteht darin, den dynamischen Polymorphismus zu entfernen und einen nicht abgeleiteten Typ zum Speichern von Schlüssel-Wert-Paaren zu verwenden. Die Basisklassenvorlage kann dann zum Auflösen dieser Zuordnungen verwendet werden:
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { m_store.setData(id, value); } template <typename T> T getData(const std::string& id) const { return m_store.getData<T>(id); } protected: ValueStore m_store; };</code>
Alternativ können Sie den Laufzeitpolymorphismus beibehalten und gleichzeitig Vorlagenparameter eliminieren, indem Sie Typlöschung verwenden. Die Verwendung von boost::any ermöglicht beispielsweise die Erstellung konkreter, nicht auf Vorlagen basierender Funktionen, die typgelöschte Argumente akzeptieren:
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { setDataImpl(id, boost::any(value)); } template <typename T> T getData(const std::string& id) const { boost::any res = getDataImpl(id); return boost::any_cast<T>(res); } protected: virtual void setDataImpl(const std::string& id, const boost::any& value) = 0; virtual boost::any getDataImpl(const std::string& id) const = 0; };</code>
Typlöschung ermöglicht es boost::any im Wesentlichen, Daten von zu speichern jeden Typ hinter den Kulissen und ermöglicht gleichzeitig den typsicheren Datenabruf.
Das obige ist der detaillierte Inhalt vonHier sind einige fragenbasierte Titel, die zum Inhalt Ihres Artikels passen: * Virtuelle C-Vorlagenmethoden: Wie erreicht man eine Vorlagenspezialisierung mit Laufzeitpolymorphismus? * C-Vorlage und Laufzeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!