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