fork(1) download
  1. #include <tuple>
  2. #include <iostream>
  3.  
  4. class Base
  5. {
  6. public:
  7. virtual ~Base(void){}
  8. };
  9.  
  10. class Derived1 : public Base
  11. {
  12. public:
  13. Derived1(int) {}
  14. virtual ~Derived1(void){}
  15. };
  16.  
  17. class Derived2 : public Base
  18. {
  19. public:
  20. virtual ~Derived2(void){}
  21. };
  22.  
  23.  
  24. namespace detail {
  25. template <class T, class Tuple, std::size_t... I>
  26. constexpr T make_from_tuple_impl( Tuple&& t, std::index_sequence<I...> )
  27. {
  28. return T(std::get<I>(std::forward<Tuple>(t))...);
  29. }
  30.  
  31. template <class T, class Tuple>
  32. constexpr T make_from_tuple( Tuple&& t )
  33. {
  34. return detail::make_from_tuple_impl<T>(std::forward<Tuple>(t),
  35. std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{});
  36. }
  37.  
  38. template<typename... Args>
  39. struct DefferedConstruct {
  40. std::tuple<Args&...> args_tuple;
  41.  
  42. template<typename T>
  43. operator T*() {
  44. return new T(make_from_tuple<T>(
  45. args_tuple
  46. ));
  47. }
  48. };
  49.  
  50. } // namespace detail
  51.  
  52. template<typename... Args>
  53. auto newObject(Args&&... args) -> detail::DefferedConstruct<Args...> {
  54. return detail::DefferedConstruct<Args...>{
  55. std::forward_as_tuple(args...)
  56. };
  57. }
  58.  
  59. int main()
  60. {
  61. // compiler picks the right newObject function according to the parameter type
  62. Derived1 *p1 = newObject(1);
  63. Derived2 *p2 = newObject();
  64.  
  65. delete p1;
  66. delete p2;
  67. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Standard output is empty