#include <iostream>
#include <algorithm>
#include <stdexcept>
/*
* Hilfskonstrukte
*/
template <typename F>
class CleanupHelper {
public:
CleanupHelper (F f) : m_f (std::move (f)) {}
~CleanupHelper () { m_f (); }
private:
F m_f;
};
template <typename F>
CleanupHelper<F> cleanup (F f) { return { std::move (f) }; }
/*
* Usercode
*/
void tuwas () {
std::cout << "Hole a\n";
int a = 42; // a holen
if (a == 0) throw std::runtime_error ("A initialization failed");
auto cleanA = cleanup ([&] () { std::cout << "Cleaning A\n"; });
std::cout << "Hole b\n";
int b = 3; // b holen
if (b == 0) throw std::runtime_error ("B initialization failed");
auto cleanB = cleanup ([&] () { std::cout << "Cleaning B\n"; });
std::cout << "Hole c\n";
int c = 0; // c holen
if (c == 0) throw std::runtime_error ("C initialization failed");
auto cleanC = cleanup ([&] () { std::cout << "Cleaning C\n"; });
}
int main() {
try {
tuwas ();
} catch (std::exception& e) {
std::cout << "Error: " << e.what () << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKLyoKICogIEhpbGZza29uc3RydWt0ZQogKi8KCnRlbXBsYXRlIDx0eXBlbmFtZSBGPgpjbGFzcyBDbGVhbnVwSGVscGVyIHsKCXB1YmxpYzoKCQlDbGVhbnVwSGVscGVyIChGIGYpIDogbV9mIChzdGQ6Om1vdmUgKGYpKSB7fQoJCX5DbGVhbnVwSGVscGVyICgpIHsgbV9mICgpOyB9Cglwcml2YXRlOgoJCUYgbV9mOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CkNsZWFudXBIZWxwZXI8Rj4gY2xlYW51cCAoRiBmKSB7IHJldHVybiB7IHN0ZDo6bW92ZSAoZikgfTsgfQoKLyoKICogVXNlcmNvZGUKICovCiAKdm9pZCB0dXdhcyAoKSB7CglzdGQ6OmNvdXQgPDwgIkhvbGUgYVxuIjsKCWludCBhID0gNDI7IC8vIGEgaG9sZW4KCWlmIChhID09IDApIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciAoIkEgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CglhdXRvIGNsZWFuQSA9IGNsZWFudXAgKFsmXSAoKSB7IHN0ZDo6Y291dCA8PCAiQ2xlYW5pbmcgQVxuIjsgfSk7CgkKCXN0ZDo6Y291dCA8PCAiSG9sZSBiXG4iOwoJaW50IGIgPSAzOyAvLyBiIGhvbGVuCglpZiAoYiA9PSAwKSB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IgKCJCIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOwoJYXV0byBjbGVhbkIgPSBjbGVhbnVwIChbJl0gKCkgeyBzdGQ6OmNvdXQgPDwgIkNsZWFuaW5nIEJcbiI7IH0pOwoJCglzdGQ6OmNvdXQgPDwgIkhvbGUgY1xuIjsKCWludCBjID0gMDsgLy8gYyBob2xlbgoJaWYgKGMgPT0gMCkgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yICgiQyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKCWF1dG8gY2xlYW5DID0gY2xlYW51cCAoWyZdICgpIHsgc3RkOjpjb3V0IDw8ICJDbGVhbmluZyBDXG4iOyB9KTsKfQoKaW50IG1haW4oKSB7Cgl0cnkgewoJCXR1d2FzICgpOwoJfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKCQlzdGQ6OmNvdXQgPDwgIkVycm9yOiAiIDw8IGUud2hhdCAoKSA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==