Corak templat berulang yang ingin tahu (CRTP) membolehkan polimorfisme statik dalam C , tetapi ia menjadi mencabar apabila bertujuan untuk ubah suai jenis pulangan fungsi berdasarkan jenis terbitan. Walaupun CRTP biasanya boleh membuat kesimpulan jenis terbitan, kod berikut menghadapi isu penyusunan dalam MSVC 2010:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; };
Ralat ini timbul kerana kelas terbitan tidak lengkap apabila digunakan sebagai parameter templat untuk kelas asas dalam asas senarai kelas. Untuk menangani isu ini, penyelesaian biasa melibatkan penggunaan templat kelas ciri:
// Declare the base_traits class template template <typename derived_t> struct base_traits; // Define the base class template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; }; // Define the derived class template <typename T> struct derived : public base<derived<T>> { typedef typename base_traits<derived<T>>::value_type value_type; }; // Specialization of base_traits for derived template <typename T> struct base_traits<derived<T>> { typedef T value_type; };
Dengan mengkhususkan templat base_traits untuk jenis terbitan yang diingini, anda boleh menentukan ahli yang diperlukan, termasuk jenis pulangan tersuai untuk fungsi seperti foo (). Teknik ini membolehkan polimorfisme statik dengan lebih fleksibiliti dalam jenis pemulangan sambil mengelakkan ralat kompilasi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Jenis Pulangan Fleksibel dengan Polimorfisme Statik C (CRTP) dan Mengelakkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!