这需要一个任意的计时持续时间并将其分解为其他持续时间数量:
template<class...Durations, class DurationIn>
std::tuple<Durations...> break_down_durations( DurationIn d ) {
std::tuple<Durations...> retval;
using discard=int[];
(void)discard{0,(void((
(std::get<Durations>(retval) = std::chrono::duration_cast<Durations>(d)),
(d -= std::chrono::duration_cast<DurationIn>(std::get<Durations>(retval)))
)),0)...};
return retval;
}
测试代码:
int main() {
auto then = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for( std::chrono::seconds(3) );
auto now = std::chrono::high_resolution_clock::now();
auto duration = now - then;
auto clean_duration = break_down_durations<std::chrono::seconds, std::chrono::milliseconds, std::chrono::microseconds>( duration );
std::cout << std::get<0>(clean_duration).count() << "::" << std::get<1>(clean_duration).count() << "::" << std::get<2>(clean_duration).count() << "\n";
}
格式化代码可以清理并放入函数中。
Live example.
为这样一个(提高精度)持续时间的元组编写自动格式化程序会很有趣。
你会写最外层的持续时间,然后是::。之后,您将前一个持续时间的一个单位转换为下一个单位,取其基于 10 的日志,然后执行setw,然后输出下一个持续时间。重复直到用完持续时间。
我可能会通过 std::size_t 的数组对 .count() 和比率进行往返。
像这样:
template<class...Durations>
std::string format_durations( std::tuple<Durations...> d ) {
std::size_t values[]={(std::size_t)std::get<Durations>(d).count()...};
auto ratios = get_ratios<Durations...>();
std::stringstream ss << std::setfill('0');
ss << values[0];
for (std::size_t const& v:values) {
std::size_t i = &v-values;
if (i==0) continue;
ss << "::" << std::setw( log_10_round_up(ratios[i-1]) ) << values[i];
}
return ss.str();
}
log_10_round_up 和 get_ratios 待写。
这可以让您获取一个持续时间,并将其格式化为 hh:mm:ss 或其他任何您想要的格式。