#include <iostream>
template<class Derived>
class Singleton {
public:
static Derived& instance() {
static Derived theInstance;
return theInstance;
}
protected:
Singleton() {}
private:
Singleton(const Singleton<Derived>&);
Singleton<Derived>& operator=(const Singleton<Derived>&);
};
class ASingleton : public Singleton<ASingleton> {
public:
void foo() { std::cout << "foo() called ..." << std::endl; }
};
int main() {
ASingleton& a = ASingleton::instance();
a.foo();
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICB0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgogICAgY2xhc3MgU2luZ2xldG9uIHsKICAgIHB1YmxpYzoKICAgICAgICBzdGF0aWMgRGVyaXZlZCYgaW5zdGFuY2UoKSB7CiAgICAgICAgICAgIHN0YXRpYyBEZXJpdmVkIHRoZUluc3RhbmNlOwogICAgICAgICAgICByZXR1cm4gdGhlSW5zdGFuY2U7CiAgICAgICAgfQoJCiAgICBwcm90ZWN0ZWQ6CiAgICAgICAgU2luZ2xldG9uKCkge30KICAgIAogICAgcHJpdmF0ZToKICAgICAgICBTaW5nbGV0b24oY29uc3QgU2luZ2xldG9uPERlcml2ZWQ+Jik7CiAgICAgICAgU2luZ2xldG9uPERlcml2ZWQ+JiBvcGVyYXRvcj0oY29uc3QgU2luZ2xldG9uPERlcml2ZWQ+Jik7CiAgICB9OwoKICAgIGNsYXNzIEFTaW5nbGV0b24gOiBwdWJsaWMgU2luZ2xldG9uPEFTaW5nbGV0b24+IHsKICAgIHB1YmxpYzoKCSAgICB2b2lkIGZvbygpIHsgc3RkOjpjb3V0IDw8ICJmb28oKSBjYWxsZWQgLi4uIiA8PCBzdGQ6OmVuZGw7IH0KICAgIH07CgogICAgaW50IG1haW4oKSB7CgkgICAgQVNpbmdsZXRvbiYgYSA9IEFTaW5nbGV0b246Omluc3RhbmNlKCk7CgkgICAgYS5mb28oKTsKCSAgICByZXR1cm4gMDsKICAgIH0=