fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class Base
  5. {
  6. public:
  7. Base() {}
  8.  
  9. virtual ~Base() {}
  10. };
  11.  
  12. class A : public Base
  13. {
  14. public:
  15. A() {}
  16. };
  17.  
  18. class B : public Base
  19. {
  20. public:
  21. B() {}
  22. };
  23.  
  24. class Copies
  25. {
  26. public:
  27. Copies() : a_{ false, A() }, b_{ false, B() } {}
  28.  
  29. void setCopy(Base* base)
  30. {
  31. if(A* a = dynamic_cast<A*>(base))
  32. a_ = std::make_pair(true, *a);
  33. else if(B* b = dynamic_cast<B*>(base))
  34. b_ = std::make_pair(true, *b);
  35. else
  36. std::cout << "Unknown object";
  37. }
  38.  
  39. void printCurrentState()
  40. {
  41. std::cout << "A: " << a_.first << std::endl;
  42. std::cout << "B: " << b_.first << std::endl;
  43. }
  44.  
  45. private:
  46. std::pair<bool, A> a_;
  47.  
  48. std::pair<bool, B> b_;
  49. };
  50.  
  51. int main()
  52. {
  53. std::unique_ptr<Base> p1(new A());
  54. std::unique_ptr<Base> p2(new B());
  55.  
  56. Copies c;
  57. c.setCopy(p1.get());
  58. c.setCopy(p2.get());
  59.  
  60. c.printCurrentState();
  61.  
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
A: 1
B: 1