C++ Academy · Lektion

Mixins med CRTP

Sammensæt adfærd ved kompilering

Lektion 3 af 413 trin

Mixins med CRTP er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad er en mixin?

En mixin er en lille, genanvendelig enhed med adfærd, som du føjer til en klasse. Med CRTP tilføjer mixins funktionalitet ved kompilering, samtidig med at de stadig kalder ind i værtsklassen.

En simpel mixin

Denne mixin tilføjer en print_twice-metode, som er afhængig af, at værten leverer 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;
}

Sammensætning af flere mixins

Du kan nedarve fra flere CRTP-mixins på én gang og stable uafhængig adfærd oven på én klasse.

#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;
}

Mixins kan også have tilstand

En mixin kan indeholde sine egne datafelter, som bliver en del af den sammensatte objekts layout.

#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;
}

Mixin kontra almindelig nedarvning

En CRTP-mixin adskiller sig fra almindelig nedarvning, fordi basisklassen kan kalde ned i den afledte klasse. Almindelige basisklasser kan ikke kalde metoder, der kun findes på den afledte type, uden virtuelle funktioner.

Politikbaseret design

Mixins muliggør politikbaseret design: Adfærd vælges ved kompilering ved at vælge, hvilke mixins der skal nedarves fra, på samme måde som std::vector tager en allokeringspolitik.

Rækkefølge og layout

Når du stabler mixins, påvirker basisklassernes rækkefølge konstruktionsrækkefølgen og objektets layout. Hold mixins uafhængige, så rækkefølgen ikke har betydning for korrektheden.

  • Konstruer i basisklassernes deklarationsrækkefølge
  • Undgå mixins, der afhænger af hinanden

Tilføjelse af en lighedsmixin

Her syntetiserer en mixin operator!= ud fra værtens lighedssammenligning.

#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;
}

Betingede mixins

Du kan kun inkludere en mixin, når en betingelse er opfyldt, ved at kombinere nedarvning med std::conditional og vælge mellem en konkret mixin og en tom en.

Optimering af tom basisklasse

Mixins, der ikke indeholder datafelter, drager fordel af optimering af tom basisklasse: Kompilatoren allokerer nul ekstra byte til dem, så det ikke koster noget i størrelse at stable mange tilstandsløse mixins.

#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;
}

Hvornår du bør vælge mixins

Mixins er særligt nyttige, når mange klasser har brug for den samme ortogonale adfærd (logning, tælling, sammenligning). De holder hver adfærd samlet ét sted og kan sammensættes uden omkostninger under kørsel.

Hurtig kontrol

Kontrollér din forståelse af CRTP-mixins.

Opsummering

Du har lært at opbygge mixins med CRTP.

  • Mixins sammensætter ortogonal adfærd ved kompilering
  • De kan kalde ned i værten og indeholde tilstand
  • Tilstandsløse mixins koster ikke ekstra takket være optimering af tom basisklasse
  • De er velegnede til politikker for logning, sammenligning og tælling
Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Mixins med CRTP” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Mixins med CRTP”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Mixins med CRTP”?

Sammensæt adfærd ved kompilering Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Mixins med CRTP”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. CRTP-idiomet
  2. Statisk polymorfi
  3. Mixins med CRTP
  4. Hvornår skal CRTP bruges
← Tilbage til C++ Academy