Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda boleh mencapai polimorfisme dengan kaedah templat maya dalam C?

Bagaimanakah anda boleh mencapai polimorfisme dengan kaedah templat maya dalam C?

DDD
DDDasal
2024-10-27 06:53:03714semak imbas

How can you achieve polymorphism with virtual template methods in C  ?

Kaedah Templat Maya C

Dalam C , ia boleh mencabar untuk menggabungkan polimorfisme masa statik (templat) dengan polimorfisme masa jalan. Ini jelas dalam kelas abstrak berikut:

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

Kelas ini bertujuan untuk menetapkan dan mendapatkan semula data jenis tertentu berdasarkan pengecam unik. Walau bagaimanapun, masalah timbul apabila cuba memanggil fungsi setData generik dengan jenis tertentu, seperti setData("foodouble", data).

Bahasa melarang binaan ini kerana pengkompil perlu secara dinamik menghantar sejumlah tak terhingga kemungkinan instantiasi templat. Untuk menyelesaikan isu ini, beberapa pendekatan boleh dilakukan:

Mengalih keluar Polimorfisme Statik:

  • Hapuskan polimorfisme statik dengan memperkenalkan jenis berasingan untuk menyimpan nilai kunci pemetaan. Templat kemudiannya boleh menyelesaikannya di peringkat asas, tanpa memerlukan polimorfisme:
<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>

Mengalih Keluar Polimorfisme Dinamik:

  • Kekalkan masa jalan polimorfisme tetapi hapuskan polimorfisme statik mengikut pemadaman jenis:
  • Gunakan boost::any, yang menyediakan pemadaman jenis, untuk menyimpan data dari sebarang jenis:
<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>

Atas ialah kandungan terperinci Bagaimanakah anda boleh mencapai polimorfisme dengan kaedah templat maya dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn