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

Dan*_*nny 2 c++ time duration c++-chrono

我昨天问了这个问题,但是我的帖子被关闭了,所以我在说空话。所以,我的代码无法编译,但我非常希望它能够编译。这是我的片段:

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;
Run Code Online (Sandbox Code Playgroud)

看起来应该非常简单,但在尝试就地减法时,我收到了“未找到运算符”错误。有什么建议么?我还尝试用以下内容替换第三行:

   auto duration = std::chrono::duration<float, std::ratio<1, 1>>(numSeconds);
Run Code Online (Sandbox Code Playgroud)

然而,这条线似乎并不是问题的原因,两种方法似乎都是有效的。这是我的最后一句话,但仍然不满意。我收到的错误代码是:

"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)"
Run Code Online (Sandbox Code Playgroud)

另外,当我将最后一行更改为:

timer.m_startTime = timer.m_startTime - duration;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误代码:

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)
Run Code Online (Sandbox Code Playgroud)

这些类型是否不兼容?我认为他们会决心做同样的事情。

How*_*ant 7

float numSeconds = 50;
Run Code Online (Sandbox Code Playgroud)

以下行:

std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
Run Code Online (Sandbox Code Playgroud)

可以更简洁地写为:

auto startTime = std::chrono::steady_clock::now();
Run Code Online (Sandbox Code Playgroud)

两种语法是等效且正确的。

无法编译的原因:

auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
Run Code Online (Sandbox Code Playgroud)

是第二个模板参数采用durationa std::ratio,而不是 a std::chrono::duration。正确的说法是:

auto duration = std::chrono::duration<float, std::ratio<1, 1>>(numSeconds);
Run Code Online (Sandbox Code Playgroud)

上面的意思是duration其类型std::chrono::duration表示float周期1 / 1秒。这意味着这只是秒的浮点计数。

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

auto duration = std::chrono::duration<float, std::ratio<1>>(numSeconds);
Run Code Online (Sandbox Code Playgroud)

而第二个模板参数std::chrono::duration默认为,std::ratio<1>因此上面可以进一步简化为:

auto duration = std::chrono::duration<float>(numSeconds);
Run Code Online (Sandbox Code Playgroud)

以下内容无法编译:

startTime -= duration;
Run Code Online (Sandbox Code Playgroud)

因为chrono有一条规则规定浮点表示的值永远不会隐式转换为整数表示的值。float这是为了避免将 a 分配给时产生的截断错误int

有几种方法可以解决这个问题。例如,您可以将结果存储在float-based中time_point

auto anotherTime = startTime - duration;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

如果你选择后者,那么就根本没有使用的意义float。整个序列可能如下所示:

using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
auto duration = 50s;
startTime -= duration;
Run Code Online (Sandbox Code Playgroud)

或者:

using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
startTime -= 50s;
Run Code Online (Sandbox Code Playgroud)

或者:

using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now() - 50s;
Run Code Online (Sandbox Code Playgroud)

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