C Static Polymorphism (CRTP) dengan Typedefs daripada Derived Classes
Dalam polimorfisme statik, juga dikenali sebagai polimorfisme masa kompilasi, jenis-jenis kelas terbitan diketahui oleh kelas asas pada masa penyusunan. Ini boleh dicapai menggunakan corak templat berulang secara ingin tahu (CRTP). Walau bagaimanapun, anda mungkin mahu menyesuaikan jenis fungsi pemulangan berdasarkan jenis terbitan.
Pertimbangkan kod berikut:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); //return some T object (assumes T is default constructable) } };
Walau bagaimanapun, kod ini mungkin tidak dikompilkan kerana penggunaan jenis alias value_type daripada kelas terbitan dalam templat kelas asas. Ralatnya ialah terbitan tidak lengkap apabila digunakan sebagai hujah templat untuk asas.
Satu penyelesaian ialah menggunakan templat kelas sifat. Berikut ialah contoh yang diubah suai:
// Declare a base_traits traits class template: template <typename derived_t> struct base_traits; // Define the base class that uses the traits: template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; value_type base_foo() { return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this)); } }; // Define the derived class; it can use the traits too: template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; // Declare and define a base_traits specialization for derived: template <typename T> struct base_traits<derived<T>> { typedef T value_type; static value_type call_foo(derived<T>* x) { return x->derived_foo(); } };
Dengan mengkhususkan base_traits untuk setiap jenis terbitan, anda boleh menyediakan ahli yang diperlukan (value_type dan call_foo) yang diperlukan oleh templat kelas asas. Ini membolehkan anda mengakses typedef dan fungsi daripada kelas terbitan dalam templat kelas asas, mencapai polimorfisme statik dengan jenis pulangan tersuai.
Atas ialah kandungan terperinci Bagaimanakah CRTP dalam C Boleh Mengendalikan Typedefs daripada Kelas Terbitan untuk Polimorfisme Statik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!