#include <utility>
#include <iostream>
#include <boost/optional.hpp>
template <typename T>
auto trycatch(T t) {
return [f = std::move(t)](auto&&... args) {
using rettype = decltype(f(std::forward<decltype(args)>(args)...));
try {
return boost::optional<rettype>(f(std::forward<decltype(args)>(args)...));
}
catch(...)
{
return boost::optional<rettype>{};
}
};
}
int access_resource1()
{
throw std::runtime_error("");
}
int access_resource2()
{
throw std::runtime_error("");
}
int calculate_smth()
{
constexpr auto default_value = 42;
auto val = trycatch(access_resource1)();
if(!val)
{
val = trycatch(access_resource2)();
}
if(!val)
{
val = default_value;
}
return *val;
}
int main() {
std::cout << calculate_smth() << std::endl;
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGJvb3N0L29wdGlvbmFsLmhwcD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgphdXRvIHRyeWNhdGNoKFQgdCkgewogIHJldHVybiBbZiA9IHN0ZDo6bW92ZSh0KV0oYXV0byYmLi4uIGFyZ3MpIHsKICAgIHVzaW5nIHJldHR5cGUgPSBkZWNsdHlwZShmKHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShhcmdzKT4oYXJncykuLi4pKTsKICAgIHRyeSB7CiAgICAgIHJldHVybiBib29zdDo6b3B0aW9uYWw8cmV0dHlwZT4oZihzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoYXJncyk+KGFyZ3MpLi4uKSk7CiAgICB9CiAgICBjYXRjaCguLi4pCiAgICB7CiAgICAgIHJldHVybiBib29zdDo6b3B0aW9uYWw8cmV0dHlwZT57fTsKICAgIH0KICAgIAogIH07Cn0KCmludCBhY2Nlc3NfcmVzb3VyY2UxKCkKewogIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiIik7Cn0KCmludCBhY2Nlc3NfcmVzb3VyY2UyKCkKewogIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiIik7Cn0KCmludCBjYWxjdWxhdGVfc210aCgpCnsKICBjb25zdGV4cHIgYXV0byBkZWZhdWx0X3ZhbHVlID0gNDI7CiAgCiAgYXV0byB2YWwgPSB0cnljYXRjaChhY2Nlc3NfcmVzb3VyY2UxKSgpOwogIGlmKCF2YWwpCiAgewogICAgICB2YWwgPSB0cnljYXRjaChhY2Nlc3NfcmVzb3VyY2UyKSgpOwogIH0KCiAgaWYoIXZhbCkKICB7CiAgICAgIHZhbCA9IGRlZmF1bHRfdmFsdWU7CiAgfQoKICByZXR1cm4gKnZhbDsKfQoKaW50IG1haW4oKSB7CiAgc3RkOjpjb3V0IDw8IGNhbGN1bGF0ZV9zbXRoKCkgPDwgc3RkOjplbmRsOwp9Cg==