#include <iostream>
#include <vector>
#include <typeinfo>
struct Shape
{
// No virtual, no polymorphism
};
struct Circle: Shape
{
};
struct Square: Shape
{
};
int main()
{
std::vector<Shape *> vec;
vec.push_back(new Square());
vec.push_back(new Circle());
std::vector<Shape *>::iterator tmp = vec.begin();
for(;tmp != vec.end(); ++tmp)
{
if(typeid(**tmp).name() == typeid(Square).name())
{
std::cout << "Square" << std::endl;;
}
else if(typeid(**tmp).name() == typeid(Circle).name())
{
std::cout << "Circle" << std::endl;;
}
else
{
std::cout << typeid(**tmp).name() << std::endl;;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZWluZm8+CgpzdHJ1Y3QgU2hhcGUKewogICAgLy8gTm8gdmlydHVhbCwgbm8gcG9seW1vcnBoaXNtCn07CgpzdHJ1Y3QgQ2lyY2xlOiBTaGFwZQp7Cgp9OwpzdHJ1Y3QgU3F1YXJlOiBTaGFwZQp7Cgp9OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxTaGFwZSAqPiB2ZWM7CiAgICB2ZWMucHVzaF9iYWNrKG5ldyBTcXVhcmUoKSk7CiAgICB2ZWMucHVzaF9iYWNrKG5ldyBDaXJjbGUoKSk7CiAgICBzdGQ6OnZlY3RvcjxTaGFwZSAqPjo6aXRlcmF0b3IgdG1wID0gdmVjLmJlZ2luKCk7CgogICAgICAgIGZvcig7dG1wICE9IHZlYy5lbmQoKTsgKyt0bXApCiAgICAgICAgewogICAgICAgICAgICBpZih0eXBlaWQoKip0bXApLm5hbWUoKSA9PSB0eXBlaWQoU3F1YXJlKS5uYW1lKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU3F1YXJlIiA8PCBzdGQ6OmVuZGw7OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZWlkKCoqdG1wKS5uYW1lKCkgPT0gdHlwZWlkKENpcmNsZSkubmFtZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkNpcmNsZSIgPDwgc3RkOjplbmRsOzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB0eXBlaWQoKip0bXApLm5hbWUoKSA8PCBzdGQ6OmVuZGw7OwogICAgICAgICAgICB9CiAgICAgICAgfQoKCn0K