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 :
Ce code fonctionne bien dans la plupart des cas, mais il y a un hic dans le cas d'héritage virtuel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } };
En effet, la construction d'une instance de B segfaute.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // le code précédent struct X: A { virtual ~X() {} }; struct B : virtual X, C<B, 13> {};
Quelqu'un aurait-il une idée sur un moyen de généraliser ce dispositif ?
Partager