#include <iostream>
#include <memory>
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 SomeClass
{
public:
void Init()
{
connect();
initialize();
}
void Cleanup()
{
disconnect();
}
void connect()
{
std::cout << "connect" << std::endl;
}
void disconnect()
{
std::cout << "disconnect" << std::endl;
}
void initialize()
{
std::cout << "initialize" << std::endl;
throw "Aaaaaaaaaaaaaaaaa";
}
int member;
};
int main()
{
{
auto pInst = Singleton<SomeClass>::Instance();
pInst->member = 10;
std::cout << pInst->member << std::endl;
}
auto pInst = Singleton<SomeClass>::Instance();
pInst->member = 20;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdHJ1Y3QgSG9sZGVyIHsKICAgICAgIEhvbGRlcigpIHsKICAgICAgICAgIHN0ZDo6Y291dCA8PCAiSG9sZGVyKCk6OkhvbGRlcigpIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICBpZiAoIVNlbGYpICBTZWxmID0gbmV3IFQoKTsKICAgICAgICAgIFNlbGYtPkluaXQoKTsKICAgICAgIH0KICAgICAgIH5Ib2xkZXIoKSB7CiAgICAgICAgICBpZiAoU2VsZikgewogICAgICAgICAgICAgU2VsZi0+Q2xlYW51cCgpOwogICAgICAgICAgICAgZGVsZXRlIFNlbGY7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIn5Ib2xkZXIoKTo6SG9sZGVyKCkiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgIH0KICAgICAgIH0KICAgICAgIFQqIFNlbGYgPSBudWxscHRyOwogICAgfTsKICAgICAKICAgICAKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgY2xhc3MgU2luZ2xldG9uIHsKICAgIHB1YmxpYzoKICAgICAgIHN0YXRpYyBUKiBJbnN0YW5jZSgpIHsKICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU2luZ2x0b246Okluc3RhbmNlKCkiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgIHN0YXRpYyBIb2xkZXI8VD4gRHVtbXk7CiAgICAgICAgICByZXR1cm4gRHVtbXkuU2VsZjsKICAgICAgIH0KICAgIHByaXZhdGU6CiAgICAgICBTaW5nbGV0b24oKSA9IGRlbGV0ZTsKICAgICAgIFNpbmdsZXRvbihTaW5nbGV0b24gY29uc3QmKSA9IGRlbGV0ZTsKICAgICAgIFNpbmdsZXRvbiYgb3BlcmF0b3I9IChTaW5nbGV0b24gY29uc3QmKSA9IGRlbGV0ZTsKICAgICAgIFNpbmdsZXRvbihTaW5nbGV0b24gY29uc3QmJikgPSBkZWxldGU7CiAgICAgICBTaW5nbGV0b24mIG9wZXJhdG9yPSAoU2luZ2xldG9uIGNvbnN0JiYpID0gZGVsZXRlOwogICAgfTsKICAgICAKICAgIGNsYXNzIFNvbWVDbGFzcwogICAgewogICAgcHVibGljOgogICAgICAgdm9pZCBJbml0KCkKICAgICAgIHsKICAgICAgICAgIGNvbm5lY3QoKTsKICAgICAgICAgIGluaXRpYWxpemUoKTsKICAgICAgIH0KICAgICAKICAgICAgIHZvaWQgQ2xlYW51cCgpCiAgICAgICB7CiAgICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICB9CiAgICAgCiAgICAgICB2b2lkIGNvbm5lY3QoKQogICAgICAgewogICAgICAgICAgc3RkOjpjb3V0IDw8ICJjb25uZWN0IiA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgCiAgICAgICB2b2lkIGRpc2Nvbm5lY3QoKQogICAgICAgewogICAgICAgICAgc3RkOjpjb3V0IDw8ICJkaXNjb25uZWN0IiA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgCiAgICAgICB2b2lkIGluaXRpYWxpemUoKQogICAgICAgewogICAgICAgICAgc3RkOjpjb3V0IDw8ICJpbml0aWFsaXplIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICB0aHJvdyAiQWFhYWFhYWFhYWFhYWFhYWEiOwogICAgICAgfQogICAgICAgaW50IG1lbWJlcjsKICAgIH07CiAgICAgCiAgICBpbnQgbWFpbigpCiAgICB7CiAgICAgICB7CiAgICAgICAgICBhdXRvIHBJbnN0ID0gU2luZ2xldG9uPFNvbWVDbGFzcz46Okluc3RhbmNlKCk7CiAgICAgICAgICBwSW5zdC0+bWVtYmVyID0gMTA7CiAgICAgICAgICBzdGQ6OmNvdXQgPDwgcEluc3QtPm1lbWJlciA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgICBhdXRvIHBJbnN0ID0gU2luZ2xldG9uPFNvbWVDbGFzcz46Okluc3RhbmNlKCk7CiAgICAgICBwSW5zdC0+bWVtYmVyID0gMjA7CiAgICAgCiAgICAgICByZXR1cm4gMDsKICAgIH0=