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