提问人:Danny 提问时间:11/30/2020 更新时间:11/30/2020 访问量:3493
尝试从time_point(C++)中减去 std::chrono::d uration,但我的代码没有编译。有什么建议吗?
Trying to subtract a std::chrono::duration from a time_point (C++), but my code isn't compiling. Any suggestions?
问:
我昨天问了这个问题,但我的线程被关闭了,所以我对着虚空说话。所以,我的代码没有编译,但我非常希望它。这是我的片段:
float numSeconds = 50;
std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
startTime -= duration;
似乎它应该非常简单,但是在尝试就地减法时,我遇到了未找到运算符的错误。有什么建议吗?我还尝试将第三行替换为以下内容:
auto duration = std::chrono::duration<float, std::ratio<1, 1>>(numSeconds);
然而,这条线似乎并不是问题的原因,这两种方法似乎都有效。这是我最后一句话,仍然不开心。我收到的错误代码是:
"Error C2679 binary '-=': no operator found which takes a right-hand operand of type 'std::chrono::duration<float,std::chrono::seconds>' (or there is no acceptable conversion)"
此外,当我将最后一行更改为:
timer.m_startTime = timer.m_startTime - duration;
我收到以下错误代码:
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'std::chrono::time_point<std::chrono::steady_clock,std::chrono::duration<float,std::ratio<1,1000000000>>>' (or there is no acceptable conversion)
这些类型在某种程度上是不兼容的吗?我认为他们会下定决心做同样的事情。
答:
float numSeconds = 50;
以下行:
std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
可以更简洁地写成:
auto startTime = std::chrono::steady_clock::now();
这两种语法都是等效且正确的。
这不编译的原因:
auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
是第二个模板参数取一个 ,而不是一个 .正确的说法是:duration
std::ratio
std::chrono::duration
auto duration = std::chrono::duration<float, std::ratio<1, 1>>(numSeconds);
以上表示类型为 和 周期为 1/1 秒。这意味着这只是一个以秒为单位的浮点计数。duration
std::chrono::duration
float
第二个模板参数默认为1,所以上面可以简化为:std::ratio
auto duration = std::chrono::duration<float, std::ratio<1>>(numSeconds);
而第二个模板参数默认为,所以上面可以进一步简化为:std::chrono::duration
std::ratio<1>
auto duration = std::chrono::duration<float>(numSeconds);
以下内容不编译:
startTime -= duration;
因为有一条规则,即具有浮点表示的值永远不会隐式转换为具有整数表示的值。这是为了避免在将 a 分配给 .chrono
float
int
有几种方法可以解决此问题。例如,您可以将结果存储在基于 -:float
time_point
auto anotherTime = startTime - duration;
anotherTime
具有类型 。std::chrono::time_point<std::chrono::steady_clock, std::chrono::duration<float, std::chrono::steady_clock::period>>
或者,您可以显式地转换回整数类型:duration
startTime -= std::chrono::duration_cast<std::chrono::seconds>(duration);
如果你选择后者,那么使用真的没有意义。整个序列可能如下所示:float
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
auto duration = 50s;
startTime -= duration;
艺术
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
startTime -= 50s;
艺术
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now() - 50s;
这里有一个1小时的视频教程,你可能会觉得有帮助: https://www.youtube.com/watch?v=P32hvk8b13M<chrono>
评论
std::chrono::steady_clock::duration
std::chrono::steady_clock::duration<float, std::ratio<1, 1>>
auto duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>( std::chrono::duration<float, std::ratio<1, 1>>(seconds));