Rumah > Artikel > pembangunan bahagian belakang > CRTP: Bolehkah Penghantaran Statik Menggantikan Polimorfisme Dinamik dalam C?
CRTP: Alternatif kepada Polimorfisme Dinamik
Polimorfisme dinamik, sambil memberikan fleksibiliti, selalunya boleh menyebabkan overhed masa jalan disebabkan penggunaan maya fungsi ahli. Mujurlah, C menawarkan alternatif yang berkesan: Corak Templat Berulang Aneh (CRTP).
CRTP membolehkan anda mencapai penghantaran statik, serupa dengan polimorfisme, tetapi tanpa overhed fungsi ahli maya. Ini dicapai melalui pengkhususan jenis dan potongan templat.
Kaedah 1: Spesifikasi Antara Muka Statik
Dengan menentukan antara muka secara statik untuk jenis terbitan anda, anda boleh menguatkuasakan tingkah laku tertentu di masa menyusun. Sebagai contoh, pertimbangkan coretan kod berikut:
<code class="cpp">template <class Derived> struct base { void foo() { static_cast<Derived *>(this)->foo(); }; };</code>
Dalam senario ini, asas<> memerlukan sebarang jenis terbitan untuk mentakrifkan fungsi ahli foo() untuk penyusunan. Setiap jenis terbitan, seperti my_type dan your_type, mesti melaksanakan fungsi foo() mereka sendiri untuk memenuhi keperluan ini.
Kaedah 2: Compile-Time Type Deduction
Sebagai alternatif , anda boleh mengelak daripada menggunakan penunjuk atau rujukan kepada kelas asas dan melakukan pendawaian jenis pada masa penyusunan. Pertimbangkan fungsi templat berikut:
<code class="cpp">template <class T> // T is deduced at compile-time void bar(base<T> &obj) { obj.foo(); // does static dispatch }</code>
Fungsi ini menerima rujukan kepada objek jenis asas
Kelebihan CRTP
Dengan memanfaatkan CRTP, anda boleh mencapai polimorfisme statik dalam C , mengelakkan kelemahan polimorfisme dinamik sambil mengekalkan faedah reka bentuk berorientasikan objek.
Atas ialah kandungan terperinci CRTP: Bolehkah Penghantaran Statik Menggantikan Polimorfisme Dinamik dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!