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

DDD
Lepaskan: 2024-10-27 06:53:03
asal
713 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!