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)
这些类型是否不兼容?我认为他们会决心做同样的事情。
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