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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
struct SpriteImpl
{ /*data*/ };
class BaseSprite
{
BaseSprite(const BaseSprite&) =delete;
template<class,class...> friend class ManageInterface;
protected:
SpriteImpl* p;
void take(BaseSprite& s) { std::swap(p,s.p); delete s.p; s.p = NULL; }
public:
BaseSprite() : p(new SpriteImpl()) {}
virtual ~BaseSprite(){ delete p; }
};
template<class...> class Sprite : public BaseSprite {};
template<class Interface, class... Arg>
class ManageInterface
{ protected: ~ManageInterface(){}
public:
template<class T>
std::unique_ptr<Sprite<T,Interface,Arg...> > add()
{ Sprite<T,Interface,Arg...>* s = new Sprite<T,Interface,Arg...>();
s->take(*(reinterpret_cast<BaseSprite*>(this)));
return std::unique_ptr<Sprite<T,Interface,Arg...> >(s); }
};
class InterfaceA;
template<class... Arg>
class Sprite<InterfaceA,Arg...> :
public Sprite<Arg...>, public ManageInterface<InterfaceA,Arg...>
{ public: virtual void fooA(){/*impl*/} };
class InterfaceB;
template<class... Arg>
class Sprite<InterfaceB,Arg...> :
public Sprite<Arg...>, public ManageInterface<InterfaceB,Arg...>
{ public: virtual void fooB(){/*impl*/} };
//Exemple d'utilisation
Sprite<InterfaceA> s;
s.fooA();
auto s2 = s.add<InterfaceB>();
s2->fooB(); |
Partager