Я пытаюсь модифицировать два фрагмента устаревшего кода. Одна из частей реализует тайм-аут для вызова функции. До сих пор он использовался на C++-методах и отлично работает.Передача функций и параметров 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 &&...)'
Может кто-то пожалуйста, скажите мне, что я делаю не так и как это исправить? Я использую Visual Studio 2015.
Вы можете уменьшить код до keast, необходимый для генерации ошибки? Какую именно версию msvc вы используете? Нет ли других сообщений об ошибках? Обычно это дает контекст. – Yakk
Компиляция с Clang в режиме C++ 11 или C++ 14. –
@Yakk, извините, должно было быть более конкретным. Я использую Visual Studio 2015. – Amol