Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencapai Penghantaran Dinamik Jenis-Selamat dengan Kaedah Templat Maya dalam C?

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

Barbara Streisand
Barbara Streisandasal
2024-10-26 08:44:30319semak imbas

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>

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>

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!

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