EDIT: вызов std :: bind() может быть заменен чем-то другим, я просто хочу, чтобы runAsyncTerminateOnException() работала с той же сигнатурой, что и std :: async() , как только обертка к немуWrapper to std :: async() не работает
Я пытаюсь создать обертку для std :: async(). Знаете ли вы, как заставить обертку работать, когда работает прямой вызов std :: async()?
Примечание: Я не буду изменять подпись функции print(), это пример. Я хотел бы, чтобы оболочка была общей и работала для всех возможных параметров, которые хорошо обрабатываются прямым вызовом std :: async().
спасибо.
#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);
std::future<void> future2 = runAsyncTerminateOnException(&Foo::print<int>, &foo, 2);
// your code goes here
return 0;
}
Здесь функция runAsyncTerminateOnException() не имеет такой же подписи, как std :: async (std :: launch :: async,?). Вы знаете, как сделать оболочку для std :: async() с той же сигнатурой и как std :: async() преодолевает эту проблему? Спасибо – infiniteLoop
@ Vittorio Romeo вы считаете, что обратный вызов можно копировать, что не может. почему бы не попытаться усовершенствовать его в лямбда? –
@DavidHaim: Я совсем недавно [написал статью о идеально-перенаправлении материала в лямбда) (https://vittorioromeo.info/index/blog/capturing_perfectly_forwarded_objects_in_lambdas.html). Это требует некоторых шаблонов/знаний, выходящих за рамки этого вопроса, но я добавлю примечание. –