El problema con mixins es ... construcción.
class Base1 { public: Base1(Dummy volatile&, int); };
class Base2 { public: Base2(Special const&, Special const&); };
Y ahora, mi súper mixin:
template <typename T>
struct Mixin: T {};
¿Notas el problema aquí? ¿Cómo diablos se supone que debo pasar los argumentos al constructor de la clase base? ¿Qué tipo de constructor debería indicar Mixin
?
Es un problema difícil, y no se ha resuelto hasta que C++ 11 mejoró el lenguaje para obtener un reenvío perfecto.
// std::foward is in <utility>
template <typename T>
struct Mixin: T {
template <typename... Args>
explicit Mixin(Args&&... args): T(std::forward<Args>(args...)) {}
};
Nota: los controles dobles son bienvenidos
Así ahora realmente podemos utilizar mixins ... y sólo hay que cambiar los hábitos de la gente :)
Por supuesto, si realmente querer es un tema totalmente diferente.
Uno de los problemas con mixins (que el artículo defectuoso que referencia omitir felizmente) es el aislamiento de dependencia que pierde por completo ... y el hecho de que los usuarios de LoggingTask
están obligados a escribir métodos de plantilla. En bases de código muy grandes, se presta más atención a las dependencias que al rendimiento, porque las dependencias queman los ciclos humanos mientras que el rendimiento solo quema ciclos de CPU ... y esos son generalmente más baratos.
Los lenguajes JIT pueden ser tan potentes como C++ para todas las aplicaciones que no sean * la mayoría * de las que requieren un gran uso del procesador. – GManNickG
@GMan: Creo que la referencia de JIT es irrelevante para la pregunta.Es una buena pregunta: es un patrón de diseño interesante que nunca he visto en ninguna de las bases de código en las que he trabajado. – Skizz
@Skizz: es totalmente irrelevante, estoy de acuerdo; pero está ahí. – GManNickG