Bagaimana untuk Mencapai Penghantaran Dinamik Jenis-Selamat dengan Kaedah Templat Maya dalam C?

Barbara Streisand
Lepaskan: 2024-10-26 08:44:30
asal
250 orang telah melayarinya

How to Achieve Type-Safe Dynamic Dispatch with Virtual Template Methods in 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>
Salin selepas log masuk

Niat di sini ialah memanggil setData("foodouble", data) akan menetapkan dua yang dikenal pasti oleh foodouble kepada nilai data.

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

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

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!

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
Artikel terbaru oleh pengarang
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!