Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Melaksanakan Kaedah Templat Maya dalam C?

Bagaimana untuk Melaksanakan Kaedah Templat Maya dalam C?

Barbara Streisand
Barbara Streisandasal
2024-10-26 09:18:30433semak imbas

How to Implement Virtual Template Methods in C  ?

Kaedah Templat Maya C

Senario yang dibentangkan melibatkan kelas abstrak dengan kaedah templat maya, setData dan getData, bertujuan untuk menetapkan dan mendapatkan semula secara dinamik data pelbagai jenis berdasarkan pengecam yang disediakan. Walau bagaimanapun, seperti yang diperakui oleh soalan, binaan sedemikian tidak disokong secara langsung dalam C .

Untuk menangani batasan ini, terdapat dua pendekatan utama:

Alih Keluar Polimorfisme Statik

Satu pilihan ialah membuang polimorfisme statik (templat) dan memperkenalkan mekanisme storan perantaraan. Kelas AbstractComputation boleh mentakrifkan ValueStore bukan templat, yang bertanggungjawab untuk menyimpan dan mendapatkan semula data berdasarkan pengecam:

<code class="cpp">class ValueStore {
public:
  template <typename T>
  void setData(std::string const &id, T value) {...}
  
  template <typename T>
  T getData(std::string const &id) {...}
};

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);
  }

private:
  ValueStore m_store;
};</code>

Kelas deriving kemudiannya boleh mengakses ValueStore secara langsung tanpa memerlukan polimorfisme masa jalan.

Alih keluar Polimorfisme Masa Jalan

Sebagai alternatif, polimorfisme masa jalan boleh dikekalkan sambil mengalih keluar polimorfisme statik. Ini melibatkan melakukan pemadaman jenis pada kelas asas:

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

boost:: any ialah jenis yang boleh menyimpan nilai apa-apa jenis dan membenarkan pengambilan semula data dengan selamat. Pemadaman jenis dilakukan dengan menghantar rangsangan::sebarang objek sebagai argumen kepada kaedah maya, yang mesti dilaksanakan dalam kelas terbitan.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan 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