私は2つのレガシーコードを改造しようとしています。ピースの1つは、関数呼び出しのタイムアウトを実装します。これまでのところ、C++のメソッドに使用され、完全に機能しています。r値参照としてC関数とパラメータを渡す
古いCライブラリと同様のタイムアウトを実装する必要があります。私はこれに同じコードを使用しようとしていますが、問題にぶつかっています。
ここでは、私が直面している問題のコードの簡略版です。
uint32_t myFunc1()
{
return 0;
}
uint32_t myFunc2(uint32_t a)
{
return a;
}
int main()
{
uint32_t dummy = 1;
timedCall(myFunc1); //compiles fine.
timedCall(myFunc2, dummy); //compile errors C2672, C2893
}
template <class F, class... Args>
uint32_t timedCall(F &&f, Args&&... a)
{
try
{
std::packaged_task<uint32_t(Args...)> myTask(std::bind(f, a...));
auto res = myTask.get_future();
std::thread(std::move(myTask), a...).detach(); //This is where the issue is.
//Do other stuff
}
catch(...)
{
//handle exceptions
}
return 0; //return something
}
私は次のエラーを取得:
C2672 'std::invoke': no matching overloaded function found
C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
誰かが私が間違ってやっているものを私に教えてもらえますし、それを修正する方法?あなたはobj()
で呼び出すことができます呼び出し可能オブジェクトを取得std::bind(f, a...)
使用するときに私は、Visual Studio 2015
あなたは減らすことができます
std::async
があなたのためにはるかに簡単にタスクを行いますが、エラーを生成するために必要なkeastまでコード化しますか?どのような正確なバージョンのmsvcを使用していますか?その他のエラーメッセージはありませんか?通常は文脈を与える。 – YakkC++ 11またはC++ 14モードでClangとコンパイルしても問題ありません。 –
@Yakk、申し訳ありませんが、より具体的なはずです。私はVisual Studio 2015を使用しています。 – Amol