我遇到的问题是std::this_thread::sleep_for实际上使用系统时钟来计算唤醒时间(至少在Windows上),而不是稳定时钟。更改系统时钟时会产生问题。例如,如果我有一个等待周期短(例如50 ms)的等待循环,然后将系统时钟设置为2分钟,则该循环将停顿2分钟而不是50 ms。这是违反直觉的。我希望它是50毫秒(加上一些小偏差)。在任何其他情况下,如果可以在随机时间唤醒,则此功能没有意义。
关于sleep_for功能的文档说可以使用系统时钟,但是我想这是标准中的一个缺陷。至少应该选择要使用的时钟类型。或者(更好的)标准应该要求时钟稳定。
因此,考虑到这种缺陷,您是否知道其他任何与平台无关的方式可以在确定的时间内睡眠?
我在模板扣除/类型转换方面遇到问题.以下代码无法编译:
template <typename Type>
struct A
{
void DoA()
{
}
};
struct B : public A<B>
{
void DoB()
{
}
};
template <typename T>
void DoSmth(const std::shared_ptr<A<T>> &p)
{
p->DoA();
}
int _tmain(int argc, _TCHAR* argv[])
{
std::shared_ptr<B> pb(new B);
DoSmth(pb);
//std::shared_ptr<A<B>> pa(pb);
//DoSmth(pa);
return 0;
};
Run Code Online (Sandbox Code Playgroud)
MSVC错误如下:
error C2664: 'void DoSmth<B>(const std::shared_ptr<A<B>> &)' : cannot convert argument 1 from 'std::shared_ptr<B>' to 'const std::shared_ptr<A<B>> &'
Binding to reference with added qualification
followed by
Call to constructor 'std::shared_ptr<A<B>>::shared_ptr<B,void>(const std::shared_ptr<B> …Run Code Online (Sandbox Code Playgroud)