EDIT:std :: bind()の呼び出しを別のものに置き換えることができます。runAsyncTerminateOnException()をstd :: async()と同じシグネチャーで動作させたいだけです。 、それにラッパーのようにラッパーと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:私は最近、[lambdaに完全転送の記事を書いた](https://vittorioromeo.info/index/blog/capturing_perfectly_forwarded_objects_in_lambdas.html)。この質問の範囲外の定型文/知識が必要ですが、注記を追加します。 –