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
- L'idioma CRTP
- Polimorfismo statico
- Mixin con CRTP
- Quando usare CRTP