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 :
	
	| 12
 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