Mixins con CRTP
Componga comportamiento en tiempo de compilación
Mixins con CRTP es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué es un mixin?
Un mixin es una unidad pequeña y reutilizable de comportamiento que se compone en una clase. Con CRTP, los mixins añaden funcionalidad en tiempo de compilación y siguen pudiendo invocar métodos de la clase anfitriona.
Un mixin sencillo
Este mixin añade un método print_twice que depende de que la clase anfitriona proporcione 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;
}Componer varios mixins
Puede heredar de varios mixins CRTP a la vez y acumular comportamientos independientes en una sola clase.
#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;
}Los mixins también añaden estado
Un mixin puede contener sus propios miembros de datos, que pasan a formar parte de la disposición de memoria del objeto compuesto.
#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 frente a herencia normal
Un mixin CRTP se diferencia de la herencia ordinaria en que la clase base puede invocar métodos de la clase derivada. Las clases base ordinarias no pueden invocar métodos que solo existen en el tipo derivado sin utilizar funciones virtuales.
Diseño basado en políticas
Los mixins permiten aplicar un diseño basado en políticas: los comportamientos se seleccionan en tiempo de compilación eligiendo de qué mixins heredar, de forma similar a como std::vector acepta una política de asignación.
Orden y disposición de memoria
Al apilar mixins, el orden de las clases base afecta al orden de construcción y a la disposición de memoria del objeto. Mantenga los mixins independientes para que el orden no afecte a la corrección.
- Se construyen en el orden de declaración de las clases base
- Evite los mixins que dependan unos de otros
Añadir un mixin de igualdad
Aquí un mixin genera operator!= a partir de la igualdad de la clase anfitriona.
#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;
}Mixins condicionales
Puede incluir un mixin solo cuando se cumpla una condición combinando la herencia con std::conditional y eligiendo entre un mixin real y uno vacío.
Optimización de la clase base vacía
Los mixins que no contienen miembros de datos se benefician de la optimización de la clase base vacía: el compilador no les asigna ningún byte adicional, por lo que apilar muchos mixins sin estado no tiene ningún coste en cuanto al tamaño.
#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;
}Cuándo utilizar mixins
Los mixins son especialmente útiles cuando muchas clases necesitan los mismos comportamientos ortogonales, como el registro, el conteo o la comparación. Mantienen cada comportamiento en un solo lugar y permiten componerlos sin coste en tiempo de ejecución.
Comprobación rápida
Compruebe cuánto ha entendido sobre los mixins CRTP.
Resumen
Ha aprendido a crear mixins con CRTP.
- Los mixins componen comportamientos ortogonales en tiempo de compilación
- Pueden invocar métodos de la clase anfitriona y contener estado
- Los mixins sin estado no tienen coste gracias a la optimización de la clase base vacía
- Son excelentes para políticas de registro, comparación y conteo
Preguntas frecuentes
¿La lección «Mixins con CRTP» es gratis?
Sí — el texto completo de «Mixins con CRTP» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Mixins con CRTP»?
Componga comportamiento en tiempo de compilación Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Mixins con CRTP»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El patrón CRTP
- Polimorfismo estático
- Mixins con CRTP
- Cuándo usar CRTP