告诉我,C 11/14/17:
1(使用时间后缀设置时间
double time1 = 1s; // time1 = 1.0
double time2 = 2m; // time2 = 120.0
double time3 = 7ms; // time3 = 0.007
2(用后缀以set
获得时间的字符串值std::cout << getTime(time1); // cout 1s
std::cout << getTime(time2); // cout 2s
std::cout << getTime(time3); // cout 7ms
-
是的,从C 14开始,您可以使用此处描述的用户定义的文字来创建持续时间:
#include <chrono> using namespace std::literals; auto time1 = 1s; // std::chrono::seconds{1} auto time2 = 2min; // std::chrono::minutes{2} auto time3 = 7ms; // std::chrono::milliseconds{7}
这些创建类型安全对象,该对象存储一个积分值。您可以很容易地在内部使用
double
,但是这些专业并没有开箱即用的类型的别名:namespace chr = std::chrono; using dbl_seconds = chr::duration<double, chr::seconds::period>; // Likewise for other units dbl_seconds time1 = 1s;
如果您绝对需要内部值(通常是一个坏主意(,则可以使用
.count()
访问它。 -
这计划在C 20中:
std::cout << time1; // 1s, or 1.000000s if using double
在此之前,您可以使用标准C 做的最好的方法是吸吮并使用
count()
:std::cout << time1.count() << 's'; // 1s
要仔细查看图书馆,请观看霍华德的CPPCON谈话。他的其他谈话涵盖了计划的C 20添加。
<chrono>
库的参考中描述了所有现代C 时间实用程序
-
是,从C 开始,我们有
std::literals::chrono_literals
,允许我们使用以下文字:operator""h operator""min operator""s operator""ms operator""us operator""ns
例如(来自cppreference(:
#include <iostream> #include <chrono> int main() { using namespace std::chrono_literals; auto day = 24h; auto halfhour = 0.5h; std::cout << "one day is " << day.count() << " hoursn" << "half an hour is " << halfhour.count() << " hoursn"; }
-
不是直接,但是从C 开始存在
std::chrono::duration
,具有几种方便的助手类型,可以正确描述时间(例如std::chrono::millisceonds
,std::chrono::hours
等(。使用那些,您可以轻松地做需要的事情。缩短了示例cppreference。如您所见,必须单独打印单元,但选择使用一些模板魔术,正确打印的单元非常容易。
#include <iostream> #include <chrono> int main() { std::chrono::seconds sec(1); std::cout << sec.count() <<" second is equal to:n"; // integer scale conversion with no precision loss: no cast std::cout << std::chrono::microseconds(sec).count() << " microsecondsn"; // integer scale conversion with precision loss: requires a cast std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count() << " minutesn"; }
-
是,通过std :: chrono_literals。
-
不是直接,但是您可以打印
typeid
(可用于调试(或自己提供流式传输持续时间的过载。
我在此处包括了operator<<
的显式过载,但是如 @Jejo ,也可以使用模板:https://wandbox.org/permlink/o495exlv4rq3z6yp
#include <iostream>
#include <chrono>
#include <typeinfo>
using namespace std::chrono_literals;
// example overloads for streaming out durations
std::ostream& operator<<(std::ostream& os, const std::chrono::nanoseconds& v) {
return os << v.count() << "ns";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::microseconds& v) {
return os << v.count() << "us";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::milliseconds& v) {
return os << v.count() << "ms";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::seconds& v) {
return os << v.count() << "s";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::minutes& v) {
return os << v.count() << "min";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::hours& v) {
return os << v.count() << "h";
}
int main() {
auto time1 = 1s;
auto time2 = 2min;
auto time3 = 7ms;
std::cout << time1.count() << " " << typeid(time1).name() << "n";
std::cout << time2.count() << " " << typeid(time2).name() << "n";
std::cout << time3.count() << " " << typeid(time3).name() << "n";
std::cout << time1 << "n";
std::cout << time2 << "n";
std::cout << time3 << "n";
}
可能的输出:
1 NSt6chrono8durationIlSt5ratioILl1ELl1EEEE
2 NSt6chrono8durationIlSt5ratioILl60ELl1EEEE
7 NSt6chrono8durationIlSt5ratioILl1ELl1000EEEE
1s
2min
7ms
1(否
2(不,不是直接。存在运算符转换为计时类型的操作员(尽管在整数上,而不是在双打上(,但没有operator<<
超载。boost::chrono
具有漂亮的打印机(虽然已弃用(。但是,它们是完全写出的,而不仅仅是简短的形式。
请参阅:
- https://en.cppreference.com/w/cpp/chrono/duration
- https://www.boost.org/doc/libs/1_70_0/doc/html/chrono.html