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 : 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;
  }
};
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
// 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 ?