chrono 中的所有 zero() 都是一样的吗
Are all of zero() in chrono the same thing
我在命名空间 std::chrono
:
中发现了很多 zero()
std::chrono::system_clock::duration::zero();
std::chrono::minutes::zero();
std::chrono::seconds::zero();
std::chrono::milliseconds::zero();
...
它们都是一样的吗?
我正在使用 std::chrono
进行编码,并且我有许多类型为 std::chrono::seconds
、std::chrono::milliseconds
的变量。如果我想检查一个变量是否为零,我应该使用哪个?
std::chrono::seconds start = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
// something
std::chrono::seconds end = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
if (end - start == 0) // std::chrono::system_clock::duration::zero()? std::seconds::zero()? std::milliseconds::zero()?
{
// something
}
在if
这种情况下,我应该使用哪种零?或者我可以使用任何人,因为他们完全一样?您可能想说 end == start
也有效,我可以接受,但我仍然想知道所有这些零是否都是同一回事。
所以seconds
、milliseconds
等是不同比例的duration类型定义:
...
std::chrono::milliseconds duration</*signed integer type of at least 45 bits*/, std::milli>
std::chrono::seconds duration</*signed integer type of at least 35 bits*/>
std::chrono::minutes duration</*signed integer type of at least 29 bits*/, std::ratio<60>>
std::chrono::hours duration</*signed integer type of at least 23 bits*/, std::ratio<3600>>
...
因此,当您在此类型上调用函数 zero
时,它会以这种类型的形式生成值,但它会调用相同的函数实现 (std::chrono::duration::zero
) 来执行此操作。它们也都具有可比性和等价性:
#include <chrono>
#include <ratio>
int main() {
static_assert((std::chrono::hours::zero() == std::chrono::nanoseconds::zero()) &&
(std::chrono::duration<short, std::nano>::zero() ==
std::chrono::duration<int, std::deci>::zero()) &&
(std::chrono::duration<short, std::deca>::zero() ==
std::chrono::duration<long, std::exa>::zero()) &&
(std::chrono::duration<long, std::atto>::zero().count() ==
std::chrono::duration<float, std::exa>::zero().count()));
// This compiles.
}
上述函数 link 的示例。
从那里开始,使用哪个不是功能,而是意见。我建议既然你选择了 std::chrono::seconds
作为 start
和 end
的类型,你应该使用 std::chrono::seconds::zero()
来保持它的一致性。但这只是我的意见。
如果您可以访问计时文字 (c++14),那么@HowardHinnant 的建议会更加简洁:
using namespace std::chrono_literals; // Somewhere in your cpp
...
if (end - start == 0s) {
我在命名空间 std::chrono
:
zero()
std::chrono::system_clock::duration::zero();
std::chrono::minutes::zero();
std::chrono::seconds::zero();
std::chrono::milliseconds::zero();
...
它们都是一样的吗?
我正在使用 std::chrono
进行编码,并且我有许多类型为 std::chrono::seconds
、std::chrono::milliseconds
的变量。如果我想检查一个变量是否为零,我应该使用哪个?
std::chrono::seconds start = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
// something
std::chrono::seconds end = std::chrono::duration_cast<T>(std::chrono::system_clock::now().time_since_epoch()); // get current time
if (end - start == 0) // std::chrono::system_clock::duration::zero()? std::seconds::zero()? std::milliseconds::zero()?
{
// something
}
在if
这种情况下,我应该使用哪种零?或者我可以使用任何人,因为他们完全一样?您可能想说 end == start
也有效,我可以接受,但我仍然想知道所有这些零是否都是同一回事。
所以seconds
、milliseconds
等是不同比例的duration类型定义:
...
std::chrono::milliseconds duration</*signed integer type of at least 45 bits*/, std::milli>
std::chrono::seconds duration</*signed integer type of at least 35 bits*/>
std::chrono::minutes duration</*signed integer type of at least 29 bits*/, std::ratio<60>>
std::chrono::hours duration</*signed integer type of at least 23 bits*/, std::ratio<3600>>
...
因此,当您在此类型上调用函数 zero
时,它会以这种类型的形式生成值,但它会调用相同的函数实现 (std::chrono::duration::zero
) 来执行此操作。它们也都具有可比性和等价性:
#include <chrono>
#include <ratio>
int main() {
static_assert((std::chrono::hours::zero() == std::chrono::nanoseconds::zero()) &&
(std::chrono::duration<short, std::nano>::zero() ==
std::chrono::duration<int, std::deci>::zero()) &&
(std::chrono::duration<short, std::deca>::zero() ==
std::chrono::duration<long, std::exa>::zero()) &&
(std::chrono::duration<long, std::atto>::zero().count() ==
std::chrono::duration<float, std::exa>::zero().count()));
// This compiles.
}
上述函数 link 的示例。
从那里开始,使用哪个不是功能,而是意见。我建议既然你选择了 std::chrono::seconds
作为 start
和 end
的类型,你应该使用 std::chrono::seconds::zero()
来保持它的一致性。但这只是我的意见。
如果您可以访问计时文字 (c++14),那么@HowardHinnant 的建议会更加简洁:
using namespace std::chrono_literals; // Somewhere in your cpp
...
if (end - start == 0s) {