#include <iostream>
#include <memory>
class Hoge
{
public:
static Hoge& GetInstance();
void Hey()
{
std::cout << foo << std::endl;
}
void SetFoo( int a )
{
foo = a;
}
private:
Hoge() : foo(0) {};
Hoge( const Hoge& a ) {};
~Hoge() {};
struct hoge_deleter;
int foo;
};
struct Hoge::hoge_deleter
{
void operator()( const Hoge* const p )
{
std::cout << "Hoge deleter" << std::endl;
delete p;
}
};
Hoge& Hoge::GetInstance()
{
static std::unique_ptr<Hoge, hoge_deleter> instance( new Hoge() );
return *instance;
}
int main()
{
Hoge& hoge1 = Hoge::GetInstance();
hoge1.SetFoo( 2 );
Hoge& hoge2 = Hoge::GetInstance();
hoge1.Hey();
hoge2.Hey();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgSG9nZQp7CnB1YmxpYzoKCXN0YXRpYyBIb2dlJiBHZXRJbnN0YW5jZSgpOwoKCXZvaWQgSGV5KCkKCXsKCQlzdGQ6OmNvdXQgPDwgZm9vIDw8IHN0ZDo6ZW5kbDsKCX0KCXZvaWQgU2V0Rm9vKCBpbnQgYSApCgl7CgkJZm9vID0gYTsKCX0KCnByaXZhdGU6CglIb2dlKCkgOiBmb28oMCkge307CglIb2dlKCBjb25zdCBIb2dlJiBhICkge307Cgl+SG9nZSgpIHt9OwoJc3RydWN0IGhvZ2VfZGVsZXRlcjsKCglpbnQgZm9vOwp9OwoKc3RydWN0IEhvZ2U6OmhvZ2VfZGVsZXRlcgp7Cgl2b2lkIG9wZXJhdG9yKCkoIGNvbnN0IEhvZ2UqIGNvbnN0IHAgKQoJewoJCXN0ZDo6Y291dCA8PCAiSG9nZSBkZWxldGVyIiA8PCBzdGQ6OmVuZGw7CgkJZGVsZXRlIHA7Cgl9Cn07CgpIb2dlJiBIb2dlOjpHZXRJbnN0YW5jZSgpCnsKCXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SG9nZSwgaG9nZV9kZWxldGVyPiBpbnN0YW5jZSggbmV3IEhvZ2UoKSApOwoJcmV0dXJuICppbnN0YW5jZTsKfQoKaW50IG1haW4oKQp7CglIb2dlJiBob2dlMSA9IEhvZ2U6OkdldEluc3RhbmNlKCk7Cglob2dlMS5TZXRGb28oIDIgKTsKCUhvZ2UmIGhvZ2UyID0gSG9nZTo6R2V0SW5zdGFuY2UoKTsKCQoJaG9nZTEuSGV5KCk7Cglob2dlMi5IZXkoKTsKfQ==