Es posible que desee mirar Loki TypeLists si realmente necesita para poder rastrear ascendencia y enumerar a través de los tipos. No estoy seguro si lo que estás pidiendo es realmente posible sin mucho trabajo. Asegúrate de no sobreingeniería aquí.
En una nota ligeramente diferente, si va a utilizar MI de esta manera (es decir, el temido diamante), entonces debe ser muy explícito sobre qué miembro virtual desea. No puedo pensar en un buen caso en el que desee elegir la semántica de B::fn()
sobre C::fn()
sin tomar una decisión explícita al escribir D
. Probablemente elegirás uno sobre el otro (o incluso ambos) según lo que haga el método individual. Una vez que haya tomado una decisión, el requisito es que los cambios heredados no cambien las expectativas o la interfaz semántica.
Si está realmente preocupado por el intercambio de una nueva clase, dicen E
en lugar de decir B
donde E
no desciende de B
pero ofrece la misma interfaz, entonces usted realmente debería usar el enfoque de la plantilla, aunque no estoy seguro por qué hay una static_cast<>
allí ...
struct A {
virtual ~A() {}
virtual void f() = 0;
};
struct B: A {
virtual void f() { std::cout << "B::f()" << std::endl; }
};
struct C: A {
virtual void f() { std::cout << "C::f()" << std::endl; }
};
template <typename Base1, typename Base2>
struct D: Base1, Base2 {
void g() { Base1::f(); Base2::f(); }
};
int main() {
D<B,C> d1;
D<C,B> d2;
d1.g();
d2.g();
return 0;
}
// Outputs:
// B::f()
// C::f()
// C::f()
// B::f()
funciona bien y parece un poco más fácil de ver.
No he podido encontrar una pregunta que responda a este problema específico. ¿puedes? – shoosh
No es porque se trata de herencia múltiple que puede adivinar que ya se trató en otras publicaciones. Le preguntaron 'Lo que trato de hacer es que D enumere de alguna manera todas las instancias de fn() que tiene en su ascendencia. ¿Es esto posible de alguna otra manera que las funciones virtuales? '.Aunque creo que fue una pregunta algo ingenua, ninguna de las preguntas que has vinculado aquí habla de tal cosa. Creo que fue bastante específico y único en su interrogatorio. -1. –