0Pricing
C++ Academy · Pelajaran

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

  1. Idiom CRTP
  2. Polimorfisme Statis
  3. Mixin dengan CRTP
  4. Kapan Menggunakan CRTP
← Kembali ke C++ Academy