#include <iostream>
#include <future>
#include <functional>
#include <type_traits>
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 {
void print() {
printf("Foo::print()\n");
}
void print2() {
printf("Foo::print2()\n");
throw 1;
}
};
int main() {
Foo foo;
std::future<void> future = runAsyncTerminateOnException(&Foo::print, &foo);
std::future<void> future2 = runAsyncTerminateOnException(&Foo::print2, &foo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnV0dXJlPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8Y2xhc3MgRm4sIGNsYXNzLi4uIEFyZ3M+CmlubGluZSBhdXRvIHJ1bkFzeW5jVGVybWluYXRlT25FeGNlcHRpb24oRm4mJiBmbiwgQXJncyYmLi4uIGFyZ3MpIHsKCWF1dG8gbWFrZV9jYWxsID0gc3RkOjpiaW5kKHN0ZDo6Zm9yd2FyZDxGbj4oZm4pLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwoJCglyZXR1cm4gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFs9XSgpIC0+IGRlY2x0eXBlKG1ha2VfY2FsbCgpKSB7CgkgIAl0cnkgewoJICAJCXJldHVybiBtYWtlX2NhbGwoKTsKCSAgCX0gY2F0Y2ggKC4uLikgewoJICAJCXN0ZDo6Y291dCA8PCAiVGVybWluYXRlIENhbGxlZCEiIDw8IHN0ZDo6ZW5kbDsKCSAgCQlzdGQ6OnRlcm1pbmF0ZSgpOwoJICAJfQoJfSk7Cn0KCnN0cnVjdCBGb28gewoJdm9pZCBwcmludCgpIHsKCQlwcmludGYoIkZvbzo6cHJpbnQoKVxuIik7Cgl9Cgl2b2lkIHByaW50MigpIHsKCQlwcmludGYoIkZvbzo6cHJpbnQyKClcbiIpOwoJCXRocm93IDE7Cgl9Cn07CgppbnQgbWFpbigpIHsKCUZvbyBmb287CglzdGQ6OmZ1dHVyZTx2b2lkPiBmdXR1cmUgPSBydW5Bc3luY1Rlcm1pbmF0ZU9uRXhjZXB0aW9uKCZGb286OnByaW50LCAmZm9vKTsKCXN0ZDo6ZnV0dXJlPHZvaWQ+IGZ1dHVyZTIgPSBydW5Bc3luY1Rlcm1pbmF0ZU9uRXhjZXB0aW9uKCZGb286OnByaW50MiwgJmZvbyk7CglyZXR1cm4gMDsKfQ==