Classe agissant sur sa dérivée
Bonjour,
Dans le cadre du développement d'une bibliothèque, je suis tombé sur un os assez costaud. Voici une description du problème, si quelqu'un a une idée :
J'ai une classe A qui contient un membre v.
J'ai une classe B qui hérite de A à un certain niveau (telles que pour b de type B, b.A::v est accessible publiquement).
Je veux écrire une classe template C<T, n> telle que si B hérite de C<B, n>, alors la construction d'un objet b de type B assigne n à b.A::v.
Pour l'instant, j'ai trouvé la solution suivante :
Code:
1 2 3 4 5 6 7 8 9
| struct A { int v; };
template<typename D, int n>
struct C {
C() {
D* dhis = static_cast<D*>(this);
A* ahis = static_cast<A*>(this);
ahis->v = n;
}
}; |
Ce code fonctionne bien dans la plupart des cas, mais il y a un hic dans le cas d'héritage virtuel :
Code:
1 2 3
| // le code précédent
struct X: A { virtual ~X() {} };
struct B : virtual X, C<B, 13> {}; |
En effet, la construction d'une instance de B segfaute.
Quelqu'un aurait-il une idée sur un moyen de généraliser ce dispositif ?