#include <iostream>
#include <vector>
#include <memory>
#include <random>
using namespace std;
struct GO { virtual void say_hello()=0; };
struct A:GO { void say_hello() { cout<<"I'm a warefulf\n";} };
struct B:GO { void say_hello() { cout<<"I'm a soldier\n";}};
template <class T>
shared_ptr<GO> generator() {
return make_shared<T>();
};
typedef shared_ptr<GO> (*gen_fn)();
vector <gen_fn> generators{generator<A>, generator<B>};
int main() {
vector<shared_ptr<GO>> universe;
default_random_engine generator;
uniform_int_distribution<int> distribution(0,generators.size()-1);
for (int i=0; i<10; i++) {
int mytype = distribution(generator);
universe.push_back(generators[mytype]());
}
for (auto x: universe)
x->say_hello();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8cmFuZG9tPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBHTyB7IHZpcnR1YWwgdm9pZCBzYXlfaGVsbG8oKT0wOyB9OwpzdHJ1Y3QgQTpHTyB7IHZvaWQgc2F5X2hlbGxvKCkgeyBjb3V0PDwiSSdtIGEgd2FyZWZ1bGZcbiI7fSB9OwpzdHJ1Y3QgQjpHTyB7IHZvaWQgc2F5X2hlbGxvKCkgeyBjb3V0PDwiSSdtIGEgc29sZGllclxuIjt9fTsKCnRlbXBsYXRlIDxjbGFzcyBUPiAKc2hhcmVkX3B0cjxHTz4gZ2VuZXJhdG9yKCkgewoJcmV0dXJuIG1ha2Vfc2hhcmVkPFQ+KCk7IAp9OwoKdHlwZWRlZiBzaGFyZWRfcHRyPEdPPiAoKmdlbl9mbikoKTsKdmVjdG9yIDxnZW5fZm4+IGdlbmVyYXRvcnN7Z2VuZXJhdG9yPEE+LCBnZW5lcmF0b3I8Qj59OwoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8c2hhcmVkX3B0cjxHTz4+IHVuaXZlcnNlOyAKCQoJZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbmVyYXRvcjsKICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3RyaWJ1dGlvbigwLGdlbmVyYXRvcnMuc2l6ZSgpLTEpOwoKICAgIGZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7ICAgCiAgICAgICAgaW50IG15dHlwZSA9IGRpc3RyaWJ1dGlvbihnZW5lcmF0b3IpOyAKICAgICAgICB1bml2ZXJzZS5wdXNoX2JhY2soZ2VuZXJhdG9yc1tteXR5cGVdKCkpOyAKICAgIH0KICAgIAogICAgZm9yIChhdXRvIHg6IHVuaXZlcnNlKSAKICAgICAgICB4LT5zYXlfaGVsbG8oKTsgCglyZXR1cm4gMDsKfQ==