#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;
    }