#include <iostream>
#include <sstream>
#include <stdexcept>
template <class Obj, class MemFn, class... Args>
bool throws(const std::string& s, const Obj& obj, MemFn&& memfn, Args&&... args)
{
try
{
(obj.*memfn)(std::forward<Args>(args)...);
std::cout << s << ": " << "Succeeded!!!" << std::endl;
return true;
}
catch (const std::exception& ex)
{
std::cout << s << ": " << "Caught : " << ex.what() << std::endl;
}
catch (...)
{
std::cout << s << ": " << "Caught unknown exception" << std::endl;
}
return false;
}
template<typename T>
struct Foo
{
std::string name;
int test_fn(T x, T y) const
{
if (y == T())
throw std::out_of_range("Integer division with zero-denominator");
return x/y;
}
int test_unknown() const
{
throw -1;
}
};
int main()
{
Foo<int> foo;
throws("First Test", foo, &Foo<int>::test_fn, 1, 1);
throws("Second Test", foo, &Foo<int>::test_fn, 1, 0);
throws("Third Test", foo, &Foo<int>::test_unknown);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KCnRlbXBsYXRlIDxjbGFzcyBPYmosIGNsYXNzIE1lbUZuLCBjbGFzcy4uLiBBcmdzPgpib29sIHRocm93cyhjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgT2JqJiBvYmosIE1lbUZuJiYgbWVtZm4sIEFyZ3MmJi4uLiBhcmdzKQp7CiAgICB0cnkKICAgIHsKICAgICAgICAob2JqLiptZW1mbikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgcyA8PCAiOiAiIDw8ICJTdWNjZWVkZWQhISEiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHMgPDwgIjogIiA8PCAiQ2F1Z2h0IDogIiA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsOwogICAgfQogICAgY2F0Y2ggKC4uLikKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgcyA8PCAiOiAiIDw8ICJDYXVnaHQgdW5rbm93biBleGNlcHRpb24iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IEZvbwp7CiAgICBzdGQ6OnN0cmluZyBuYW1lOwoKICAgIGludCB0ZXN0X2ZuKFQgeCwgVCB5KSBjb25zdAogICAgewogICAgICAgIGlmICh5ID09IFQoKSkKICAgICAgICAgICAgdGhyb3cgc3RkOjpvdXRfb2ZfcmFuZ2UoIkludGVnZXIgZGl2aXNpb24gd2l0aCB6ZXJvLWRlbm9taW5hdG9yIik7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHgveTsKICAgIH0KICAgIAogICAgaW50IHRlc3RfdW5rbm93bigpIGNvbnN0CiAgICB7CiAgICAgICAgdGhyb3cgLTE7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIEZvbzxpbnQ+IGZvbzsKICAgIHRocm93cygiRmlyc3QgVGVzdCIsIGZvbywgJkZvbzxpbnQ+Ojp0ZXN0X2ZuLCAxLCAxKTsKICAgIHRocm93cygiU2Vjb25kIFRlc3QiLCBmb28sICZGb288aW50Pjo6dGVzdF9mbiwgMSwgMCk7CiAgICB0aHJvd3MoIlRoaXJkIFRlc3QiLCBmb28sICZGb288aW50Pjo6dGVzdF91bmtub3duKTsKICAgIHJldHVybiAwOwp9