fork download
  1. #include <iostream>
  2. #include <functional>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <memory>
  6.  
  7. struct A
  8. {
  9. A()
  10. {
  11. std::cout << __PRETTY_FUNCTION__ << '\n';
  12. }
  13.  
  14. virtual void f() const
  15. {
  16. std::cout << "A";
  17. }
  18. };
  19.  
  20.  
  21. struct B : public A
  22. {
  23. B()
  24. {
  25. std::cout << __PRETTY_FUNCTION__ << '\n';
  26. }
  27.  
  28. virtual void f() const override
  29. {
  30. std::cout << "B";
  31. }
  32. };
  33.  
  34.  
  35. struct C : public B
  36. {
  37. C()
  38. {
  39. std::cout << __PRETTY_FUNCTION__ << '\n';
  40. }
  41.  
  42. virtual void f() const override
  43. {
  44. std::cout << "C";
  45. }
  46. };
  47.  
  48. struct Test
  49. {
  50. std::vector<std::shared_ptr<A>> vec;
  51.  
  52. template<class... Args>
  53. Test(Args&&... args) :
  54. vec { std::make_shared<std::remove_reference_t<Args>>(std::forward<Args>(args))... }
  55. {
  56. }
  57.  
  58. void print() const
  59. {
  60. for (auto const& ptr : vec)
  61. ptr->f();
  62. std::cout.put('\n');
  63. }
  64. };
  65.  
  66. int main()
  67. {
  68. Test test { A(), B(), C() };
  69. test.print();
  70. }
  71.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
A::A()
A::A()
B::B()
A::A()
B::B()
C::C()
ABC