Pour le problème initial, je soupçonne fort que T soit en réalité un variant, non ? Je doute que la fonction accepte n’importe quoi comme T.
Cela dit, je pense qu’une bonne solution pour ça, c’est le pattern NVI, avec un truc du genre :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class Father {
protected:
virtual void bar_(LightTWrapperBase& wrapper)=0;
public:
template<typename T>
void bar(T const& param) {
LightWrapper<T> p(param);
bar_(p);
}
};
class Son : public Father {
protected:
void bar_(LightTWrapperBase& wrapper) override;
};
// et
class LightTWrapperBase {
// mettre ici les méthodes utiles en virtuelles pures
};
template<typename T>
class LightTWrapper {
protected:
T const& value;
public:
... // override de la classe de base
}; |
Note : ça coûte un appel virtuel en plus, et grossit probablement un peu l’exécutable.
Partager