Следующий код запускает неблокирующий таймер, который запускает функцию myFunc
через одну секунду:
MyClass.h:
std::future<void> timer_future_;
MyClass.cpp:
timer_future_ = std::async(
std::launch::async,
[this] { QTimer::singleShot(1000,
[this] {this->myFunc();}
);
}
);
Я хотел бы заменить лямбда-функции на std::function
с. Я успешно заменил вторую лямбду следующим образом:
timer_future_ = std::async(
std::launch::async,
[this] { QTimer::singleShot(1000,
std::bind(&MyClass::myFunc, this)
);
}
);
Как теперь я могу заменить первую лямбду другим std::bind()
вызовом?
Обратите внимание, что функция QTimer::singleShot
из библиотек Qt; его документация здесь . Его прототип:
void QTimer::singleShot(int msec, Functor functor)
Согласно этому вопросу определение типа Functor можно найти в QObject.h
. Там написано:
template <class FunctorT, class R, typename... Args> class Functor { /*...*/ }
После некоторых исследований я понимаю, что std::bind()
, который заменит первую лямбду, должен учитывать следующее:
Я предпринял несколько неудачных попыток, последняя из которых была:
timer_future_ = std::async(
std::launch::async,
std::bind( ( void(*) (int, Functor<const std::function<void(void)>,void>) )&QTimer::singleShot,
1000,
std::bind(&MyClass::myFunc, this)
)
);
Для этого кода компилятор MSVC вернул сообщение об ошибке
error: C2059: syntax error: ')'
в третьей строке.
Почему бы мне просто не использовать лямбды, которые уже работают? Ответ прост: вместо этого попытка использовать std :: bind () учит меня различным возможностям языка C ++. и как их использовать.
РЕДАКТИРОВАТЬ: Код, который реализует ответ Куба Обер:
QTimer::singleShot(1000, [this] {
timer_future_ = std::async(
std::launch::async,
std::bind(&MyClass::myFunc, this)
);
});