尝试从 time_point (C++) 中减去 std::chrono::duration,但我的代码未编译。有什么建议么?

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);

上面的意思是 duration 的类型 std::chrono::duration 具有 表示 float句点1/1 秒。这意味着这只是秒数的浮点数。

std::ratio的第二个模板参数默认为1,所以上面可以简化为:

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;

因为 chrono 有一条规则说具有浮点表示的值永远不会隐式转换为具有整数表示的值。这是为了避免将 float 分配给 int.

时导致的截断错误

有几种方法可以解决这个问题。例如,您可以将结果存储在基于 floattime_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;

这是一个关于 <chrono> 的 1 小时视频教程,您可能会觉得有用:https://www.youtube.com/watch?v=P32hvk8b13M