我正尝试按如下方式使用计时持续时间,但如果我将比率增加到任何高于 std::ratio<1,50>
的值它在编译期间抛出一个错误 error: no viable overloaded '-='
什么时候elapsed -= tickeRate
发生。
int main()
{
using clock = std::chrono::high_resolution_clock;
using seconds = std::chrono::seconds;
std::chrono::duration<long long, std::ratio<1,20>> tickRate(1);
// std::chrono::duration<long long, std::ratio<1,60>> tickRate(1);
clock::time_point start, stop;
start = clock::now();
std::this_thread::sleep_for(seconds(1));
stop = clock::now();
clock::duration elapsed = stop - start;
int i = 0;
while (elapsed >= tickRate)
{
elapsed -= tickRate;
i++;
}
std::cout << "ticked " << i << " times." << std::endl;
return 0;
}
第一个问题是,为什么它只在 tickRate
时抛出错误? > 1/50?第二个是,我可以学习什么主题,以便将来可以通过此类问题进行推理?
编辑:
编译器版本为:Apple LLVM version 7.0.2 (clang-700.1.81)
此外,这实际上适用于较小的数字,但不太确定是哪个。对我来说,1/51 .. 1/99 失败了,但 1/100 又开始正常工作了。我尝试了 grins 和 1/2500、1/3600 的 double 抛出相同的错误。现在我更糊涂了。
最佳答案
减一duration
从另一个你应该确保他们的时期是等分的。这里:
elapsed -= tickRate;
你试着减去std::chrono::duration<long long, std::ratio<1,60>>
(在第二个间隔的 1/60
中)来自 clock::duration
这是(至少在 MSVC++ 2015 上)等于 std::chrono::duration<long long, std::ratio_multiply<std::ratio<100,1>,std::nano>>
恰好是 100 ns
.
总结起来,这里的问题是1/60 s
不是 100 ns
间隔的整数倍.
关于c++ - 为什么较小的 chrono::durations 不会减去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38791782/