C++:使用后缀设置时间
C++: setting time using suffixes
告诉我,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
1) 否
2) 不,不是直接的。存在转换为计时类型的运算符(尽管是整数而不是双精度类型)但它们没有 operator<<
重载。 boost::chrono
有漂亮的打印机(虽然它们已被弃用)。然而,它们是完全写出来的,而不仅仅是简短的形式。
参见:
所有现代 C++ 时间实用程序都在 the reference for <chrono>
library
中进行了描述
是,从c++14开始我们有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() << " hours\n"
<< "half an hour is " << halfhour.count() << " hours\n";
}
不是直接,而是从c++11开始存在
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() << " microseconds\n";
// integer scale conversion with precision loss: requires a cast
std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
<< " minutes\n";
}
是,通过std::chrono_literals。
不直接,但您可以打印 typeid
(可用于调试)或自己提供流持续时间的重载。
我在这里包含了 operator<<
的显式重载,但是 @JeJo, it can also be done with templates: 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
是的,从 C++14 开始,您可以使用 user-defined 文字 described here 来创建持续时间:
#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}
这些创建 type-safe 存储整数值的对象。您可以在内部相当轻松地使用 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
要深入了解图书馆,请观看 Howard's CppCon talk。他的其他演讲涵盖计划中的 C++20 添加内容。
告诉我,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
1) 否
2) 不,不是直接的。存在转换为计时类型的运算符(尽管是整数而不是双精度类型)但它们没有 operator<<
重载。 boost::chrono
有漂亮的打印机(虽然它们已被弃用)。然而,它们是完全写出来的,而不仅仅是简短的形式。
参见:
所有现代 C++ 时间实用程序都在 the reference for <chrono>
library
是,从c++14开始我们有
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() << " hours\n" << "half an hour is " << halfhour.count() << " hours\n"; }
不是直接,而是从c++11开始存在
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() << " microseconds\n"; // integer scale conversion with precision loss: requires a cast std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count() << " minutes\n"; }
是,通过std::chrono_literals。
不直接,但您可以打印
typeid
(可用于调试)或自己提供流持续时间的重载。
我在这里包含了 operator<<
的显式重载,但是 @JeJo, it can also be done with templates: 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
是的,从 C++14 开始,您可以使用 user-defined 文字 described here 来创建持续时间:
#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}
这些创建 type-safe 存储整数值的对象。您可以在内部相当轻松地使用
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
要深入了解图书馆,请观看 Howard's CppCon talk。他的其他演讲涵盖计划中的 C++20 添加内容。