#include <iostream>
#include <memory>
#include <functional>
class Object
{
virtual ~Object() { std::cout << "Object::~Object()" << std::endl; }
public:
static Object* instance()
{
static std::unique_ptr<Object, std::function<void(Object*)>> instance(nullptr, [](Object *object) { delete object; });
if (!instance)
instance.reset(new Object);
return instance.get();
}
void test()
{
std::cout << "Object::test()" << std::endl;
}
};
int main()
{
Object::instance()->test();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIE9iamVjdAp7CiAgICB2aXJ0dWFsIH5PYmplY3QoKSB7IHN0ZDo6Y291dCA8PCAiT2JqZWN0Ojp+T2JqZWN0KCkiIDw8IHN0ZDo6ZW5kbDsgfQoKcHVibGljOgogICAgc3RhdGljIE9iamVjdCogaW5zdGFuY2UoKQogICAgewogICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8T2JqZWN0LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoT2JqZWN0Kik+PiBpbnN0YW5jZShudWxscHRyLCBbXShPYmplY3QgKm9iamVjdCkgeyBkZWxldGUgb2JqZWN0OyB9KTsKICAgICAgICBpZiAoIWluc3RhbmNlKQogICAgICAgICAgICBpbnN0YW5jZS5yZXNldChuZXcgT2JqZWN0KTsKICAgICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0KCk7CiAgICB9CiAgICAKICAgIHZvaWQgdGVzdCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJPYmplY3Q6OnRlc3QoKSIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBPYmplY3Q6Omluc3RhbmNlKCktPnRlc3QoKTsKfQ==