fork download
  1. #include <iostream>
  2. #include <tuple>
  3.  
  4. struct Result
  5. {
  6. Result() : m_success(true) {}
  7. explicit operator bool() const { return !m_success; }
  8. bool m_success;
  9. };
  10.  
  11. template<unsigned index, typename... Types>
  12. struct TupleItemDeleter
  13. {
  14. void operator() (std::tuple<Types...>& t)
  15. {
  16. std::cout << "Deleting item at index " << index << std::endl;
  17. delete std::get<index>(t);
  18. TupleItemDeleter<index - 1, Types...>{}(t);
  19. }
  20. };
  21.  
  22. template<typename... Types>
  23. struct TupleItemDeleter<0, Types...>
  24. {
  25. void operator() (std::tuple<Types...>& t)
  26. {
  27. std::cout << "Deleting item at index 0" << std::endl;
  28. delete std::get<0>(t);
  29. }
  30. };
  31.  
  32. template<typename... Types>
  33. void deleter(std::tuple<Types...>& t)
  34. {
  35. constexpr auto tupleSize = std::tuple_size<std::tuple<Types...>>::value;
  36. TupleItemDeleter<tupleSize - 1, Types...>{}(t);
  37. }
  38.  
  39.  
  40. template<typename... T>
  41. struct CleanupHelper {
  42.  
  43. CleanupHelper (const Result& res, const std::tuple<T...>& itemsToDelete)
  44. : m_result(res)
  45. , m_itemsToDelete(itemsToDelete)
  46. {
  47. }
  48.  
  49. ~CleanupHelper()
  50. {
  51. if(!m_result)
  52. {
  53. deleter(m_itemsToDelete);
  54. }
  55. }
  56.  
  57. const Result& m_result;
  58. std::tuple<T...> m_itemsToDelete;
  59. };
  60.  
  61. struct Foo {};
  62.  
  63. Result functionThatNeedsCleanup()
  64. {
  65. Result res;
  66. Foo *pFoos_1, *pFoos_2;
  67. CleanupHelper<Foo*,Foo*> cleanupHelper(res, std::make_tuple(pFoos_1, pFoos_2));
  68. try
  69. {
  70. pFoos_1 = new Foo;
  71. pFoos_2 = new Foo[10];
  72. //
  73. // Do work
  74. //
  75. }
  76. catch(...)
  77. {
  78. res.m_success = false;
  79. }
  80. }
  81.  
  82. int main()
  83. {
  84. functionThatNeedsCleanup();
  85. return 0;
  86. }
Success #stdin #stdout 0s 4140KB
stdin
Standard input is empty
stdout
Deleting item at index 1
Deleting item at index 0