Mixin dengan CRTP
Gabungkan tingkah laku semasa kompilasi
Mixin dengan CRTP ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah Campuran?
Campuran ialah unit tingkah laku kecil yang boleh digunakan semula dan digabungkan ke dalam kelas. Dengan CRTP, campuran menambah fungsi pada masa kompilasi sambil masih memanggil kelas hos.
Campuran Mudah
Campuran ini menambah kaedah print_twice yang bergantung pada hos untuk menyediakan value().
#include <iostream>
template <typename T>
struct PrintTwice {
void print_twice() const {
auto v = static_cast<const T*>(this)->value();
std::cout << v << " " << v << "\n";
}
};
struct Box : PrintTwice<Box> {
int value() const { return 7; }
};
int main() {
Box{}.print_twice();
return 0;
}Menggabungkan Beberapa Campuran
Anda boleh mewarisi daripada beberapa campuran CRTP serentak, lalu menyusun tingkah laku yang berasingan pada satu kelas.
#include <iostream>
template <typename T>
struct Loggable {
void log() const { std::cout << "log: " << static_cast<const T*>(this)->id() << "\n"; }
};
template <typename T>
struct Resettable {
void reset() { static_cast<T*>(this)->set(0); }
};
struct Device : Loggable<Device>, Resettable<Device> {
int v = 5;
int id() const { return v; }
void set(int x) { v = x; }
};
int main() {
Device d;
d.log();
d.reset();
d.log();
return 0;
}Campuran Juga Menambah Keadaan
Campuran boleh membawa ahli datanya sendiri, yang kemudiannya menjadi sebahagian daripada susun atur objek yang digabungkan.
#include <iostream>
template <typename T>
struct Tagged {
int tag = 0;
void set_tag(int t) { tag = t; }
int get_tag() const { return tag; }
};
struct Item : Tagged<Item> {
const char* name = "item";
};
int main() {
Item it;
it.set_tag(42);
std::cout << it.name << " " << it.get_tag() << "\n";
return 0;
}Campuran berbanding Pewarisan Biasa
Campuran CRTP berbeza daripada pewarisan biasa kerana kelas asas boleh memanggil ke bawah ke dalam kelas terbitan. Kelas asas biasa tidak boleh memanggil kaedah yang hanya wujud pada jenis terbitan tanpa fungsi maya.
Reka Bentuk Berasaskan Dasar
Campuran membolehkan reka bentuk berasaskan dasar: tingkah laku dipilih pada masa kompilasi dengan menentukan campuran yang hendak diwarisi, serupa dengan cara std::vector menerima dasar peruntuk.
Susunan dan Susun Atur
Apabila campuran disusun bertingkat, susunan kelas asas mempengaruhi susunan pembinaan dan susun atur objek. Pastikan campuran tidak bergantung antara satu sama lain supaya susunan tidak menjejaskan ketepatan.
- Bina mengikut susunan pengisytiharan kelas asas
- Elakkan campuran yang saling bergantung
Menambah Campuran Kesamaan
Di sini, campuran menghasilkan operator!= berdasarkan kesamaan hos.
#include <iostream>
template <typename T>
struct EqualityMixin {
friend bool operator!=(const T& a, const T& b) { return !(a == b); }
};
struct P : EqualityMixin<P> {
int x;
P(int v) : x(v) {}
friend bool operator==(const P& a, const P& b) { return a.x == b.x; }
};
int main() {
std::cout << (P(1) != P(2)) << "\n";
return 0;
}Campuran Bersyarat
Anda boleh menyertakan campuran hanya apabila sesuatu syarat dipenuhi dengan menggabungkan pewarisan dengan std::conditional, lalu memilih antara campuran sebenar dengan campuran kosong.
Pengoptimuman Asas Kosong
Campuran yang tidak menyimpan ahli data mendapat manfaat daripada Pengoptimuman Asas Kosong: pengkompil memperuntukkan sifar bait tambahan untuknya, jadi menyusun banyak campuran tanpa keadaan tidak menambah saiz.
#include <iostream>
template <typename T>
struct A {};
template <typename T>
struct B {};
struct C : A<C>, B<C> {
int x;
};
int main() {
std::cout << (sizeof(C) == sizeof(int)) << "\n";
return 0;
}Bila Hendak Menggunakan Campuran
Campuran amat berguna apabila banyak kelas memerlukan tingkah laku ortogonal yang sama (pengelogan, pengiraan, perbandingan). Campuran mengekalkan setiap tingkah laku di satu tempat dan membolehkannya digabungkan tanpa kos masa jalan.
Semakan Pantas
Uji pemahaman anda tentang campuran CRTP.
Ulang Kaji
Anda telah mempelajari cara membina campuran dengan CRTP.
- Campuran menggabungkan tingkah laku ortogonal pada masa kompilasi
- Campuran boleh memanggil ke bawah ke dalam hos dan membawa keadaan
- Campuran tanpa keadaan tidak menambah kos berkat Pengoptimuman Asas Kosong
- Sangat sesuai untuk dasar pengelogan, perbandingan dan pengiraan
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Mixin dengan CRTP” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Mixin dengan CRTP”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mixin dengan CRTP”?
Gabungkan tingkah laku semasa kompilasi Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Mixin dengan CRTP” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Idiom CRTP
- Polimorfisme Statik
- Mixin dengan CRTP
- Bila Menggunakan CRTP