0Pricing
C++ Academy · Lezione

Mixin con CRTP

Comporre il comportamento in fase di compilazione

Mixin con CRTP è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Che cos'è un mixin?

Un mixin è una piccola unità riutilizzabile di comportamento che viene composta in una classe. Con CRTP, i mixin aggiungono funzionalità in fase di compilazione continuando a effettuare chiamate verso la classe ospitante.

Un semplice mixin

Questo mixin aggiunge un metodo print_twice che presuppone che la classe ospitante fornisca 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;
}

Comporre più mixin

Può ereditare contemporaneamente da diversi mixin CRTP, accumulando comportamenti indipendenti in un'unica classe.

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

Anche i mixin possono aggiungere stato

Un mixin può contenere propri membri dati, che diventano parte del layout dell'oggetto composto.

#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 ed ereditarietà semplice

Un mixin CRTP si differenzia dall'ereditarietà ordinaria perché la classe base può chiamare verso il basso, cioè la classe derivata. Le classi base ordinarie non possono chiamare metodi presenti solo nel tipo derivato senza ricorrere alle funzioni virtuali.

Design basato su policy

I mixin consentono un design basato su policy: i comportamenti vengono selezionati in fase di compilazione scegliendo da quali mixin ereditare, in modo simile a quanto avviene quando std::vector accetta una policy per l'allocator.

Ordine e layout

Quando si impilano i mixin, l'ordine delle classi base influisce sull'ordine di costruzione e sul layout dell'oggetto. Mantenga i mixin indipendenti, in modo che l'ordine non influisca sulla correttezza.

  • La costruzione avviene nell'ordine di dichiarazione delle classi base
  • Eviti i mixin che dipendono l'uno dall'altro

Aggiungere un mixin per l'uguaglianza

In questo caso, un mixin sintetizza operator!= a partire dall'uguaglianza della classe ospitante.

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

Mixin condizionali

Può includere un mixin solo quando una condizione è soddisfatta, combinando l'ereditarietà con std::conditional per scegliere tra un mixin reale e uno vuoto.

Ottimizzazione della classe base vuota

I mixin che non contengono membri dati traggono vantaggio dalla Empty Base Optimization: il compilatore assegna loro zero byte aggiuntivi, quindi impilare molti mixin senza stato non comporta alcun costo in termini di dimensioni.

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

Quando scegliere i mixin

I mixin sono particolarmente utili quando molte classi necessitano degli stessi comportamenti ortogonali (logging, conteggio, confronto). Mantengono ogni comportamento in un unico punto e consentono di comporli senza costi in fase di esecuzione.

Verifica rapida

Verifichi la sua comprensione dei mixin CRTP.

Riepilogo

Ha imparato a creare mixin con CRTP.

  • I mixin compongono comportamenti ortogonali in fase di compilazione
  • Possono chiamare la classe ospitante e contenere stato
  • I mixin senza stato non hanno costi aggiuntivi grazie all'Empty Base Optimization
  • Sono ideali per policy di logging, confronto e conteggio

Domande Frequenti

La lezione «Mixin con CRTP» è gratuita?

Sì — il testo completo di «Mixin con CRTP» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Mixin con CRTP»?

Comporre il comportamento in fase di compilazione Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Mixin con CRTP»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. L'idioma CRTP
  2. Polimorfismo statico
  3. Mixin con CRTP
  4. Quando usare CRTP
← Torna a C++ Academy