fork(1) download
  1. #include <type_traits>
  2. #include <utility>
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. template <typename Type>
  7. class ptr_scope_manager
  8. {
  9. private:
  10. std::vector<Type> ptrs;
  11.  
  12. public:
  13. template <typename T = Type, typename... Args>
  14. auto create(Args&&... args) -> typename std::enable_if<!std::is_constructible<T, Args...>::value, T*>::type
  15. {
  16. std::cout << "push_back" << std::endl;
  17. ptrs.push_back(T{ std::forward<Args>(args)... });
  18. return &ptrs.back();
  19. }
  20.  
  21. template <typename T = Type, typename... Args>
  22. auto create(Args&&... args) -> typename std::enable_if<std::is_constructible<T, Args...>::value, T*>::type
  23. {
  24. std::cout << "emplace_back" << std::endl;
  25. ptrs.emplace_back(std::forward<Args>(args)...);
  26. return &ptrs.back();
  27. }
  28. };
  29.  
  30. class public_ctor
  31. {
  32. int i;
  33.  
  34. public:
  35. public_ctor(int i): i(i) {} // public
  36. };
  37.  
  38. class private_ctor
  39. {
  40. friend class ptr_scope_manager<private_ctor>;
  41. int i;
  42.  
  43. private:
  44. private_ctor(int i): i(i) {} // private
  45. };
  46.  
  47. class non_friendly_private_ctor
  48. { int i;
  49.  
  50. private:
  51. non_friendly_private_ctor(int i): i(i) {} // private
  52. };
  53.  
  54.  
  55. int main()
  56. {
  57. ptr_scope_manager<public_ctor> public_manager;
  58. ptr_scope_manager<private_ctor> private_manager;
  59. ptr_scope_manager<non_friendly_private_ctor> non_friendly_private_manager;
  60.  
  61. public_manager.create(3);
  62.  
  63. private_manager.create(3);
  64.  
  65. // non_friendly_private_manager.create(3); raises error
  66. }
  67.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
emplace_back
push_back