#include <functional>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
template<typename F>
class finally
{
public:
template<typename... Args>
finally<F>(F action, Args&&... args) :
_action([action, &args...]{ action(std::forward<Args>(args)...); }) {}
~finally()
try
{
if (enabled)
_action();
}
catch (...)
{
// Logging and stuff
}
bool enabled = true;
private:
std::function<void()> _action;
};
int main()
{
int fd = open("/proc/mounts", O_RDONLY);
finally<int(int)> f(close, fd);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBGPgpjbGFzcyBmaW5hbGx5CnsKcHVibGljOgogICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KICAgIGZpbmFsbHk8Rj4oRiBhY3Rpb24sIEFyZ3MmJi4uLiBhcmdzKSA6CiAgICAgICAgX2FjdGlvbihbYWN0aW9uLCAmYXJncy4uLl17IGFjdGlvbihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOyB9KSB7fQoKICAgIH5maW5hbGx5KCkKICAgIHRyeQogICAgewogICAgICAgIGlmIChlbmFibGVkKQogICAgICAgICAgICBfYWN0aW9uKCk7CiAgICB9CiAgICBjYXRjaCAoLi4uKQogICAgewogICAgICAgIC8vIExvZ2dpbmcgYW5kIHN0dWZmCiAgICB9CgogICAgYm9vbCBlbmFibGVkID0gdHJ1ZTsKCnByaXZhdGU6CiAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gX2FjdGlvbjsKfTsKCmludCBtYWluKCkKewogICAgaW50IGZkID0gb3BlbigiL3Byb2MvbW91bnRzIiwgT19SRE9OTFkpOwogICAgZmluYWxseTxpbnQoaW50KT4gZihjbG9zZSwgZmQpOwp9