fork download
  1. #include <memory>
  2. #include <vector>
  3. #include <iostream>
  4.  
  5. struct some_interface
  6. {
  7. virtual ~some_interface()
  8. {}
  9.  
  10. virtual void foo() = 0;
  11. };
  12.  
  13. template <typename Foo>
  14. struct C : public some_interface
  15. {
  16. std::unique_ptr<Foo> foo_;
  17.  
  18. C(std::unique_ptr<Foo> foo_)
  19. : foo_(std::move(foo_))
  20. {}
  21.  
  22. virtual void foo()
  23. {
  24. foo_->foo();
  25. }
  26. };
  27.  
  28. struct known_foo
  29. {
  30. void foo()
  31. {
  32. std::cout << "known foo\n";
  33. }
  34. };
  35.  
  36. struct foo_base
  37. {
  38. virtual ~foo_base()
  39. {}
  40.  
  41. virtual void foo() = 0;
  42. };
  43.  
  44. struct unknown_foo : public foo_base
  45. {
  46. virtual void foo()
  47. {
  48. std::cout << "unknown foo\n";
  49. }
  50. };
  51.  
  52. template <typename T, typename... Args>
  53. std::unique_ptr<T> bad_make_unique(Args&&... args)
  54. {
  55. return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
  56. }
  57.  
  58. int main()
  59. {
  60. std::vector<std::unique_ptr<some_interface>> interfaces;
  61. interfaces.push_back(bad_make_unique<C<known_foo>>(bad_make_unique<known_foo>()));
  62. interfaces.push_back(bad_make_unique<C<foo_base>>(bad_make_unique<unknown_foo>()));
  63.  
  64. for (auto& e : interfaces)
  65. e->foo();
  66. }
Success #stdin #stdout 0s 2988KB
stdin
Standard input is empty
stdout
known foo
unknown foo