diff --git a/src/defer.h b/src/defer.h new file mode 100644 index 0000000..b7dc7af --- /dev/null +++ b/src/defer.h @@ -0,0 +1,21 @@ +#ifndef DEFER_H +#define DEFER_H + +#include +#include + +class Defer { +public: + Defer(std::function func) : func_(func) {} + ~Defer() { func_(); } + +private: + std::function func_; +}; + +#define CONCAT_IMPL(a, b) a##b +#define CONCAT(a, b) CONCAT_IMPL(a, b) + +#define DEFER(code) Defer CONCAT(defer__, __LINE__)([&]() { code; }); + +#endif // DEFER_H diff --git a/src/main.cpp b/src/main.cpp index 0ab7f9b..2e0c183 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,15 @@ +#include "defer.h" #include +struct Meep { + std::string foo = "Meep!"; +}; + int main() { - std::cout << "Hello, World!" << std::endl; + Meep *meep = new Meep(); + DEFER(delete meep); + + DEFER(std::cout << "Goodbye, " << meep->foo << std::endl); + std::cout << "Hello, " << meep->foo << std::endl; return 0; }