Skip to content

Instantly share code, notes, and snippets.

@jeffersonfr
Last active February 16, 2023 01:36
Show Gist options
  • Save jeffersonfr/60398dd7412c7d04052cd1d00ae0ea0d to your computer and use it in GitHub Desktop.
Save jeffersonfr/60398dd7412c7d04052cd1d00ae0ea0d to your computer and use it in GitHub Desktop.
GoLang's defer in C++
#include <iostream>
#include <type_traits>
#include <functional>
struct DeferObject {
DeferObject() = default;
~DeferObject() {
mCallback();
}
DeferObject & operator = (std::function<void()> callback) {
mCallback = callback;
return *this;
}
std::function<void()> mCallback;
};
#define ConcatName(base, ext) \
base ## ext
#define ObjectName(base, ext) \
ConcatName(base, ext)
#define DeferName(name) \
DeferObject name; \
name = [&]()
#define defer \
DeferName(ObjectName(__defer__, __COUNTER__))
int main() {
std::cout << "Hi" << std::endl;
defer {
std::cout << "Bye" << std::endl;
};
std::cout << "End" << std::endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment