#include <iostream>
#include <functional>
using namespace std;
#define def_unnamed_imp(x, y) unnamed_##x##_##y
#define def_unnamed_decl(X, Y) def_unnamed_imp(X, Y)
#define UNNAMED def_unnamed_decl(__COUNTER__, __LINE__)
class call_at_delete
{
std::function<void()> m_functor;
public:
template<class Functor>
call_at_delete(const Functor& _func) : m_functor(_func){}
~call_at_delete(){m_functor();}
};
#define finally call_at_delete UNNAMED = [&]()
void test()
{
int i = 10;
finally
{
cout << i << " hello\n";
};
try
{
i = 100;
throw exception();
}
catch(...)
{
cout << "exeption\n";
}
}
int main()
{
test();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZGVmX3VubmFtZWRfaW1wKHgsIHkpIHVubmFtZWRfIyN4IyNfIyN5CiNkZWZpbmUgZGVmX3VubmFtZWRfZGVjbChYLCBZKSBkZWZfdW5uYW1lZF9pbXAoWCwgWSkKI2RlZmluZSBVTk5BTUVEIGRlZl91bm5hbWVkX2RlY2woX19DT1VOVEVSX18sIF9fTElORV9fKQoKY2xhc3MgY2FsbF9hdF9kZWxldGUKewoJc3RkOjpmdW5jdGlvbjx2b2lkKCk+IG1fZnVuY3RvcjsKcHVibGljOgoJdGVtcGxhdGU8Y2xhc3MgRnVuY3Rvcj4KCWNhbGxfYXRfZGVsZXRlKGNvbnN0IEZ1bmN0b3ImIF9mdW5jKSA6IG1fZnVuY3RvcihfZnVuYyl7fQoJfmNhbGxfYXRfZGVsZXRlKCl7bV9mdW5jdG9yKCk7fQp9OwoKI2RlZmluZSBmaW5hbGx5IGNhbGxfYXRfZGVsZXRlIFVOTkFNRUQgPSBbJl0oKQoKCnZvaWQgdGVzdCgpCnsKCWludCBpID0gMTA7CgkKCWZpbmFsbHkKCXsKCQljb3V0IDw8IGkgPDwgIiBoZWxsb1xuIjsKCX07Cgl0cnkKCXsKCQlpID0gMTAwOwoJCXRocm93IGV4Y2VwdGlvbigpOwoJfQoJY2F0Y2goLi4uKQoJewoJCWNvdXQgPDwgImV4ZXB0aW9uXG4iOwoJfQoJCn0KCgoKaW50IG1haW4oKQp7Cgl0ZXN0KCk7CgoKCXJldHVybiAwOwp9