#include <iostream>
using namespace std;

template<class T>
class Singleton {
protected:
    Singleton() {}
public:
    static T *getInstance() {
        if (_instance == NULL) _instance = new T;
        return _instance;
    }
private:
    static T *_instance;
};

template <class T>
T *Singleton<T>::_instance = NULL;

class A : public Singleton<A> {
    friend class Singleton<A>; // singleton doit avoir acces au constructeur
public:
    void affiche() { cout << "A@" << this << endl; }
private:
    A() {}
};
class B : public Singleton<B> {
    friend class Singleton<B>; // singleton doit avoir acces au constructeur
public:
    void affiche() { cout << "B@" << this << endl; }
private:
    B() {}
};

int main() {
    A::getInstance()->affiche();
    A::getInstance()->affiche(); // meme adresse
    B::getInstance()->affiche(); // mais ici adresse differente car A!=B
}
