Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencapai Penghantaran Dinamik Jenis-Selamat dengan Kaedah Templat Maya dalam C?
Jenis Polimorfisme dalam C : Kaedah Templat Maya
Dalam pengaturcaraan C, menggabungkan fungsi ahli maya dengan templat kelas boleh menjadi mencabar. Keadaan ini timbul apabila anda ingin menghantar kaedah secara dinamik berdasarkan maklumat jenis masa jalan, tetapi masih mengekalkan tingkah laku selamat jenis.
Masalahnya
Pertimbangkan kelas abstrak berikut dan pelaksanaan terbitannya:
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data) = 0; template <class T> virtual T getData(std::string id) = 0; }; class Computation : public AbstractComputation { public: template <class T> void setData(std::string id, T data); template <class T> T getData(std::string id, T data); };</code>
Niat di sini ialah memanggil setData
Penyelesaian Berkemungkinan
1. Buang Polimorfisme Statik:
Satu pendekatan ialah menghapuskan polimorfisme statik (templat) dan memperkenalkan stor generik untuk pasangan nilai kunci:
<code class="cpp">class ValueStore { template <typename T> void setData(std::string const & id, T value); template <typename T> T getData(std::string const & id) const; }; 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>
Penyelesaian ini menyediakan polimorfisme dinamik tanpa memerlukan pengkhususan templat.
2. Alih Keluar Polimorfisme Dinamik:
Pilihan lain ialah mengekalkan polimorfisme masa jalan tetapi alih keluar polimorfisme statik:
<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>
Di sini, taip pemadaman menggunakan boost::any membenarkan penghantaran kepada bukan templat kaedah tanpa mengorbankan keselamatan jenis.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Penghantaran Dinamik Jenis-Selamat dengan Kaedah Templat Maya dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!