#include <iostream>
#include <memory>
class Base
{
public:
Base() {}
virtual ~Base() {}
};
class A : public Base
{
public:
A() {}
};
class B : public Base
{
public:
B() {}
};
class Copies
{
public:
Copies() : a_{ false, A() }, b_{ false, B() } {}
void setCopy(Base* base)
{
if(A* a = dynamic_cast<A*>(base))
a_ = std::make_pair(true, *a);
else if(B* b = dynamic_cast<B*>(base))
b_ = std::make_pair(true, *b);
else
std::cout << "Unknown object";
}
void printCurrentState()
{
std::cout << "A: " << a_.first << std::endl;
std::cout << "B: " << b_.first << std::endl;
}
private:
std::pair<bool, A> a_;
std::pair<bool, B> b_;
};
int main()
{
std::unique_ptr<Base> p1(new A());
std::unique_ptr<Base> p2(new B());
Copies c;
c.setCopy(p1.get());
c.setCopy(p2.get());
c.printCurrentState();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQmFzZQp7CnB1YmxpYzoKCUJhc2UoKSB7fQoKCXZpcnR1YWwgfkJhc2UoKSB7fQp9OwoKY2xhc3MgQSA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgoJQSgpIHt9Cn07CgpjbGFzcyBCIDogcHVibGljIEJhc2UKewpwdWJsaWM6CglCKCkge30KfTsKCmNsYXNzIENvcGllcwp7CnB1YmxpYzoKCUNvcGllcygpIDogYV97IGZhbHNlLCBBKCkgfSwgYl97IGZhbHNlLCBCKCkgfSB7fQoKCXZvaWQgc2V0Q29weShCYXNlKiBiYXNlKQoJewoJCWlmKEEqIGEgPSBkeW5hbWljX2Nhc3Q8QSo+KGJhc2UpKQoJCQlhXyA9IHN0ZDo6bWFrZV9wYWlyKHRydWUsICphKTsKCQllbHNlIGlmKEIqIGIgPSBkeW5hbWljX2Nhc3Q8Qio+KGJhc2UpKQoJCQliXyA9IHN0ZDo6bWFrZV9wYWlyKHRydWUsICpiKTsKCQllbHNlCgkJCXN0ZDo6Y291dCA8PCAiVW5rbm93biBvYmplY3QiOwoJfQoKCXZvaWQgcHJpbnRDdXJyZW50U3RhdGUoKQoJewoJCXN0ZDo6Y291dCA8PCAiQTogIiA8PCBhXy5maXJzdCA8PCBzdGQ6OmVuZGw7CgkJc3RkOjpjb3V0IDw8ICJCOiAiIDw8IGJfLmZpcnN0IDw8IHN0ZDo6ZW5kbDsKCX0KCnByaXZhdGU6CglzdGQ6OnBhaXI8Ym9vbCwgQT4gYV87CgoJc3RkOjpwYWlyPGJvb2wsIEI+IGJfOwp9OwoKaW50IG1haW4oKQp7CglzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gcDEobmV3IEEoKSk7CglzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gcDIobmV3IEIoKSk7CgoJQ29waWVzIGM7CgljLnNldENvcHkocDEuZ2V0KCkpOwoJYy5zZXRDb3B5KHAyLmdldCgpKTsKCgljLnByaW50Q3VycmVudFN0YXRlKCk7CgoJcmV0dXJuIDA7Cn0K