#include <iostream>
#include <string>
#include <map>
#include <memory>
using namespace std;
struct parent_class {
virtual void say_hello() { cout << "Hello, I'm parent"<<endl; }
virtual ~parent_class() {}
};
struct child_class : parent_class {
void say_hello() override { cout << "Hello, I'm child"<<endl; }
};
template <typename T>
void do_dope_stuff(int arg1, std::map<uint32_t, shared_ptr<T>>& my_object){
//do some programmer magic
for (auto &x:my_object) {
cout << x.first<<": ";
x.second->say_hello();
}
}
int main() {
std::map<uint32_t, shared_ptr<parent_class>> my_map;
my_map[777]=make_shared<parent_class>();
my_map[911]=make_shared<child_class>();
my_map[89]=make_shared<parent_class>();
do_dope_stuff(1, my_map);
cout << endl<<"second try:"<<endl;
std::map<uint32_t, shared_ptr<child_class>> his_map;
his_map[888]=make_shared<child_class>();
his_map[912]=make_shared<child_class>();
do_dope_stuff(1, his_map);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IHBhcmVudF9jbGFzcyB7Cgl2aXJ0dWFsIHZvaWQgc2F5X2hlbGxvKCkgeyBjb3V0IDw8ICJIZWxsbywgSSdtIHBhcmVudCI8PGVuZGw7IH0KCXZpcnR1YWwgfnBhcmVudF9jbGFzcygpIHt9Cn07CnN0cnVjdCBjaGlsZF9jbGFzcyA6IHBhcmVudF9jbGFzcyB7Cgl2b2lkIHNheV9oZWxsbygpIG92ZXJyaWRlIHsgY291dCA8PCAiSGVsbG8sIEknbSBjaGlsZCI8PGVuZGw7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGRvX2RvcGVfc3R1ZmYoaW50IGFyZzEsIHN0ZDo6bWFwPHVpbnQzMl90LCBzaGFyZWRfcHRyPFQ+PiYgbXlfb2JqZWN0KXsKICAgIC8vZG8gc29tZSBwcm9ncmFtbWVyIG1hZ2ljCiAgICBmb3IgKGF1dG8gJng6bXlfb2JqZWN0KSB7CiAgICAJY291dCA8PCB4LmZpcnN0PDwiOiAiOwogICAgICAgIHguc2Vjb25kLT5zYXlfaGVsbG8oKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CglzdGQ6Om1hcDx1aW50MzJfdCwgc2hhcmVkX3B0cjxwYXJlbnRfY2xhc3M+PiBteV9tYXA7CglteV9tYXBbNzc3XT1tYWtlX3NoYXJlZDxwYXJlbnRfY2xhc3M+KCk7IAoJbXlfbWFwWzkxMV09bWFrZV9zaGFyZWQ8Y2hpbGRfY2xhc3M+KCk7IAoJbXlfbWFwWzg5XT1tYWtlX3NoYXJlZDxwYXJlbnRfY2xhc3M+KCk7IAoJZG9fZG9wZV9zdHVmZigxLCBteV9tYXApOwoJCgljb3V0IDw8IGVuZGw8PCJzZWNvbmQgdHJ5OiI8PGVuZGw7IAoJc3RkOjptYXA8dWludDMyX3QsIHNoYXJlZF9wdHI8Y2hpbGRfY2xhc3M+PiBoaXNfbWFwOwoJaGlzX21hcFs4ODhdPW1ha2Vfc2hhcmVkPGNoaWxkX2NsYXNzPigpOyAKCWhpc19tYXBbOTEyXT1tYWtlX3NoYXJlZDxjaGlsZF9jbGFzcz4oKTsgCglkb19kb3BlX3N0dWZmKDEsIGhpc19tYXApOwoJCgkKCQoJcmV0dXJuIDA7Cn0=