以下代码启动一个非阻塞计时器,它将在一秒钟后启动函数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
替换lambda函数。我已经成功地替换了第二个lambda,如下所示:
timer_future_ = std::async(
std::launch::async,
[this] { QTimer::singleShot(1000,
std::bind(&MyClass::myFunc, this)
);
}
);
我现在如何用另一个std::bind()
电话替换第一个lambda?
注意函数QTimer::singleShot
来自Qt库;其文件是here。它的原型是:
void QTimer::singleShot(int msec, Functor functor)
根据this question,可以在QObject.h
中找到Functor类型的定义。它说:
template <class FunctorT, class R, typename... Args> class Functor { /*...*/ }
经过一些研究,我了解到将取代第一个lambda的std::bind()
必须考虑以下因素:
QTimer::singleShot
是一个重载函数,因此I must use a cast to disambiguate the call to it QTimer::singleShot
是一个静态成员函数,因此the pointer to it must resemble a pointer to a non-member function 我做了几次不成功的尝试,最后一次是:
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: ')'
在第三行。
为什么我不使用已经工作的lambdas?答案很简单,试图使用std :: bind()代替我教会我更多关于C ++的各种功能语言以及如何使用它们。
编辑:实施Kuba Ober答案的代码:
QTimer::singleShot(1000, [this] {
timer_future_ = std::async(
std::launch::async,
std::bind(&MyClass::myFunc, this)
);
});
答案 0 :(得分:0)
计算左右括号并添加分号
答案 1 :(得分:0)
计时器需要一个事件循环,std::async
将在没有运行事件循环的工作线程中调用它。我怀疑你为什么要这么做?
如果要在延迟后在工作线程中运行某些东西,请在具有事件循环的线程中运行计时器,然后从该计时器触发异步操作。