#include <string>
#include <vector>
#include <memory>
#include <algorithm>
#include <iostream>
struct Base
{
typedef std::shared_ptr<Base> SharedPtr;
virtual ~Base(){}
virtual void print(){}
template<class T>
static SharedPtr makeDerived(const std::string& name);
static std::vector<SharedPtr> objs;
};
std::vector<Base::SharedPtr> Base::objs;
template<class T>
struct Derived : public Base
{
Derived(const std::string& name):name(name){}
void print(){std::cout<<name<<std::endl;}
std::string name;
};
template<class T>
Base::SharedPtr Base::makeDerived(const std::string& name)
{
SharedPtr p = std::make_shared<Derived<T> >(Derived<T>(name));
objs.push_back(p);
return p;
}
int main()
{
Base::makeDerived<bool>("online");
Base::makeDerived<int>("users");
std::for_each(Base::objs.begin(),Base::objs.end(),[](Base::SharedPtr p){p->print();});
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UKewogICAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4gU2hhcmVkUHRyOwogICAgdmlydHVhbCB+QmFzZSgpe30KICAgIHZpcnR1YWwgdm9pZCBwcmludCgpe30KICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICBzdGF0aWMgU2hhcmVkUHRyIG1ha2VEZXJpdmVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKICAgIAogICAgc3RhdGljIHN0ZDo6dmVjdG9yPFNoYXJlZFB0cj4gb2JqczsKfTsKc3RkOjp2ZWN0b3I8QmFzZTo6U2hhcmVkUHRyPiBCYXNlOjpvYmpzOwp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCnsKICAgIERlcml2ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOm5hbWUobmFtZSl7fQogICAgdm9pZCBwcmludCgpe3N0ZDo6Y291dDw8bmFtZTw8c3RkOjplbmRsO30KICAgIHN0ZDo6c3RyaW5nIG5hbWU7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpCYXNlOjpTaGFyZWRQdHIgQmFzZTo6bWFrZURlcml2ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCnsKICAgIFNoYXJlZFB0ciBwID0gc3RkOjptYWtlX3NoYXJlZDxEZXJpdmVkPFQ+ID4oRGVyaXZlZDxUPihuYW1lKSk7CiAgICBvYmpzLnB1c2hfYmFjayhwKTsKICAgIHJldHVybiBwOwp9CgppbnQgbWFpbigpCnsKICAgIEJhc2U6Om1ha2VEZXJpdmVkPGJvb2w+KCJvbmxpbmUiKTsKICAgIEJhc2U6Om1ha2VEZXJpdmVkPGludD4oInVzZXJzIik7CiAgICBzdGQ6OmZvcl9lYWNoKEJhc2U6Om9ianMuYmVnaW4oKSxCYXNlOjpvYmpzLmVuZCgpLFtdKEJhc2U6OlNoYXJlZFB0ciBwKXtwLT5wcmludCgpO30pOwp9