#include <iostream>
#include <vector>
struct X{
static std::vector<X*>& getRegistry(){
static std::vector<X*> registry;
return registry;
}
X(){
getRegistry().push_back(this); // Each X adds itself to the registry
}
};
template<typename T>
struct Y : X{
private:
static T instance; // The per-type singleton
};
template<typename T>
T Y<T>::instance {};
struct A : Y<A>{};
struct B : Y<B>{};
struct C : Y<C>{};
int main(){
std::cout << "Number of objects in the registry: " << X::getRegistry().size() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IFh7CgogICAgc3RhdGljIHN0ZDo6dmVjdG9yPFgqPiYgZ2V0UmVnaXN0cnkoKXsKICAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPFgqPiByZWdpc3RyeTsKICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5OwogICAgfQoKICAgIFgoKXsKICAgICAgICBnZXRSZWdpc3RyeSgpLnB1c2hfYmFjayh0aGlzKTsgLy8gRWFjaCBYIGFkZHMgaXRzZWxmIHRvIHRoZSByZWdpc3RyeQogICAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFkgOiBYeyAKcHJpdmF0ZTogICAKICAgc3RhdGljIFQgaW5zdGFuY2U7IC8vIFRoZSBwZXItdHlwZSBzaW5nbGV0b24KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+ClQgWTxUPjo6aW5zdGFuY2Uge307CgpzdHJ1Y3QgQSA6IFk8QT57fTsKc3RydWN0IEIgOiBZPEI+e307CnN0cnVjdCBDIDogWTxDPnt9OwoKaW50IG1haW4oKXsKCXN0ZDo6Y291dCA8PCAiTnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5OiAiIDw8IFg6OmdldFJlZ2lzdHJ5KCkuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsJCn0K