#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////
template<typename T>
struct Holder {
Holder() {
std::cout << "Holder()::Holder()" << std::endl;
if (!Self) Self = new T();
Self->Init();
}
~Holder() {
if (Self) {
Self->Cleanup();
delete Self;
std::cout << "~Holder()::Holder()" << std::endl;
}
}
T* Self = nullptr;
};
////////////////////////////////////////////////////////////////////////////////////////
template <typename T>
class Singleton {
public:
static T* Instance() {
std::cout << "Singlton::Instance()" << std::endl;
static Holder<T> Dummy;
return Dummy.Self;
}
private:
Singleton() = delete;
Singleton(Singleton const&) = delete;
Singleton& operator= (Singleton const&) = delete;
Singleton(Singleton const&&) = delete;
Singleton& operator= (Singleton const&&) = delete;
};
class Global {
public:
int GetA() {
cout << "GetA" << endl;
return x-1;
}
int GetB() {
cout << "GetB" << endl;
return x+1;
}
void Init() {};
void Cleanup() {};
private:
int x = 1;
};
struct Test1Class {
void Print() {
cout << Singleton<Global>::Instance()->GetA() << endl;
}
};
struct Test2Class {
void Print() {
cout << Singleton<Global>::Instance()->GetB() << endl;
}
};
int main() {
Test1Class T1;
Test2Class T2;
T1.Print();
T2.Print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IEhvbGRlciB7CiAgSG9sZGVyKCkgewogICAgc3RkOjpjb3V0IDw8ICJIb2xkZXIoKTo6SG9sZGVyKCkiIDw8IHN0ZDo6ZW5kbDsKICAgIGlmICghU2VsZikgIFNlbGYgPSBuZXcgVCgpOwogICAgU2VsZi0+SW5pdCgpOwogIH0KICB+SG9sZGVyKCkgewogICAgaWYgKFNlbGYpIHsKICAgICAgU2VsZi0+Q2xlYW51cCgpOwogICAgICBkZWxldGUgU2VsZjsKICAgICAgc3RkOjpjb3V0IDw8ICJ+SG9sZGVyKCk6OkhvbGRlcigpIiA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgfQogIFQqIFNlbGYgPSBudWxscHRyOwp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFNpbmdsZXRvbiB7CiAgcHVibGljOgogICAgc3RhdGljIFQqIEluc3RhbmNlKCkgewogICAgICBzdGQ6OmNvdXQgPDwgIlNpbmdsdG9uOjpJbnN0YW5jZSgpIiA8PCBzdGQ6OmVuZGw7CiAgICAgIHN0YXRpYyBIb2xkZXI8VD4gRHVtbXk7CiAgICAgIHJldHVybiBEdW1teS5TZWxmOwogICAgfQogIHByaXZhdGU6CiAgICBTaW5nbGV0b24oKSA9IGRlbGV0ZTsKICAgIFNpbmdsZXRvbihTaW5nbGV0b24gY29uc3QmKSA9IGRlbGV0ZTsKICAgIFNpbmdsZXRvbiYgb3BlcmF0b3I9IChTaW5nbGV0b24gY29uc3QmKSA9IGRlbGV0ZTsKICAgIFNpbmdsZXRvbihTaW5nbGV0b24gY29uc3QmJikgPSBkZWxldGU7CiAgICBTaW5nbGV0b24mIG9wZXJhdG9yPSAoU2luZ2xldG9uIGNvbnN0JiYpID0gZGVsZXRlOwp9OwoKY2xhc3MgR2xvYmFsIHsKICBwdWJsaWM6CiAgICBpbnQgR2V0QSgpIHsgCiAgICAgIGNvdXQgPDwgIkdldEEiIDw8IGVuZGw7CiAgICAgIHJldHVybiB4LTE7IAogICAgfQogICAgaW50IEdldEIoKSB7IAogICAgICBjb3V0IDw8ICJHZXRCIiA8PCBlbmRsOyAgICAJCiAgICAgIHJldHVybiB4KzE7IAogICAgfQogICAgdm9pZCBJbml0KCkge307CiAgICB2b2lkIENsZWFudXAoKSB7fTsKICBwcml2YXRlOgogICAgaW50IHggPSAxOwp9OwoKc3RydWN0IFRlc3QxQ2xhc3MgewogIHZvaWQgUHJpbnQoKSB7CiAgICBjb3V0IDw8IFNpbmdsZXRvbjxHbG9iYWw+OjpJbnN0YW5jZSgpLT5HZXRBKCkgPDwgZW5kbDsgIAkKICB9CQp9OwoKc3RydWN0IFRlc3QyQ2xhc3MgewogIHZvaWQgUHJpbnQoKSB7CiAgICBjb3V0IDw8IFNpbmdsZXRvbjxHbG9iYWw+OjpJbnN0YW5jZSgpLT5HZXRCKCkgPDwgZW5kbDsgIAkKICB9CQp9OwoKCmludCBtYWluKCkgewogIFRlc3QxQ2xhc3MgVDE7CiAgVGVzdDJDbGFzcyBUMjsKICBUMS5QcmludCgpOwogIFQyLlByaW50KCk7CiAgcmV0dXJuIDA7Cn0=