Mixin dengan CRTP
Gabungkan perilaku saat kompilasi
Mixin dengan CRTP adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Apa Itu Campuran?
Sebuah campuran adalah unit kecil perilaku yang dapat digunakan ulang dan disusun ke dalam kelas. Dengan CRTP, campuran menambahkan fungsionalitas saat kompilasi sambil tetap memanggil kelas pemilik.
Campuran Sederhana
Campuran ini menambahkan metode print_twice yang bergantung pada kelas pemilik 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;
}Menyusun Beberapa Campuran
Anda dapat mewarisi beberapa campuran CRTP sekaligus, lalu menumpuk perilaku yang saling independen ke dalam 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 Menambahkan Keadaan
Sebuah campuran dapat membawa anggota datanya sendiri, yang kemudian menjadi bagian dari tata letak objek yang disusun.
#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 vs Pewarisan Biasa
Campuran CRTP berbeda dari pewarisan biasa karena kelas dasar dapat memanggil ke dalam kelas turunan. Kelas dasar biasa tidak dapat memanggil metode yang hanya ada pada tipe turunan tanpa fungsi virtual.
Rancangan Berbasis Kebijakan
Campuran memungkinkan rancangan berbasis kebijakan: perilaku dipilih saat kompilasi dengan menentukan campuran mana yang diwarisi, serupa dengan cara std::vector menerima kebijakan alokator.
Urutan dan Tata Letak
Saat menumpuk campuran, urutan kelas dasar memengaruhi urutan konstruksi dan tata letak objek. Pastikan campuran saling independen agar urutannya tidak memengaruhi kebenaran.
- Lakukan konstruksi menurut urutan deklarasi kelas dasar
- Hindari campuran yang saling bergantung
Menambahkan Campuran Kesetaraan
Di sini, campuran membentuk operator!= dari kesetaraan kelas pemilik.
#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 dapat menyertakan campuran hanya ketika suatu kondisi terpenuhi dengan menggabungkan pewarisan dengan std::conditional, lalu memilih antara campuran nyata dan campuran kosong.
Optimisasi Base Kosong
Campuran yang tidak memiliki anggota data memperoleh manfaat dari Optimisasi Base Kosong: kompilator mengalokasikan nol bita tambahan untuknya, sehingga menumpuk banyak campuran tanpa keadaan tidak menambah ukuran.
#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;
}Kapan Menggunakan Campuran
Campuran sangat berguna ketika banyak kelas memerlukan perilaku ortogonal yang sama, seperti pencatatan log, penghitungan, dan perbandingan. Campuran menjaga setiap perilaku tetap berada di satu tempat dan menyusunnya tanpa biaya saat waktu proses.
Uji Cepat
Uji pemahaman Anda tentang campuran CRTP.
Ringkasan
Anda telah mempelajari cara membuat campuran dengan CRTP.
- Campuran menyusun perilaku ortogonal saat kompilasi
- Campuran dapat memanggil ke dalam kelas pemilik dan membawa keadaan
- Campuran tanpa keadaan tidak menambah ukuran berkat Optimisasi Base Kosong
- Sangat cocok untuk kebijakan pencatatan log, perbandingan, dan penghitungan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mixin dengan CRTP” gratis?
Ya — teks lengkap “Mixin dengan CRTP” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mixin dengan CRTP”?
Gabungkan perilaku saat kompilasi Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mixin dengan CRTP” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Idiom CRTP
- Polimorfisme Statis
- Mixin dengan CRTP
- Kapan Menggunakan CRTP