#include <iostream>
#include <functional>
#include <future>
template<class Fn, class... Args>
inline auto runAsyncTerminateOnException(Fn&& fn, Args&&... args) {
auto make_call = std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...);
return std::async(std::launch::async, [=]() -> decltype(make_call()) {
try {
return make_call();
} catch (...) {
std::cout << "Terminate Called!" << std::endl;
std::terminate();
}
});
}
struct Foo {
template<class... Args>
void print(Args&&... args) {
printf("Foo::print(%d)\n", std::forward<Args>(args)...);
}
};
int main() {
Foo foo;
std::future<void> future = std::async(std::launch::async, &Foo::print<int>, &foo, 2);
// your code goes here
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogICAgI2luY2x1ZGUgPGZ1dHVyZT4KICAgICAKICAgIHRlbXBsYXRlPGNsYXNzIEZuLCBjbGFzcy4uLiBBcmdzPgogICAgaW5saW5lIGF1dG8gcnVuQXN5bmNUZXJtaW5hdGVPbkV4Y2VwdGlvbihGbiYmIGZuLCBBcmdzJiYuLi4gYXJncykgewogICAgICAgIGF1dG8gbWFrZV9jYWxsID0gc3RkOjpiaW5kKHN0ZDo6Zm9yd2FyZDxGbj4oZm4pLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogICAgIAogICAgICAgIHJldHVybiBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgWz1dKCkgLT4gZGVjbHR5cGUobWFrZV9jYWxsKCkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBtYWtlX2NhbGwoKTsKICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlRlcm1pbmF0ZSBDYWxsZWQhIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgICBzdGQ6OnRlcm1pbmF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICAgCiAgICBzdHJ1Y3QgRm9vIHsKICAgIAl0ZW1wbGF0ZTxjbGFzcy4uLiBBcmdzPgogICAgICAgIHZvaWQgcHJpbnQoQXJncyYmLi4uIGFyZ3MpIHsKICAgICAgICAgICAgcHJpbnRmKCJGb286OnByaW50KCVkKVxuIiwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICAgICAgICB9CiAgICB9OwogICAgIAogICAgaW50IG1haW4oKSB7CiAgICAgICAgRm9vIGZvbzsKICAgICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBmdXR1cmUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJkZvbzo6cHJpbnQ8aW50PiwgJmZvbywgMik7CiAgICAgICAgLy8geW91ciBjb2RlIGdvZXMgaGVyZQogICAgICAgIHJldHVybiAwOwogICAgfQ==