Это занимает произвольную длительность хронографа и разбивает его на другие продолжительности величин:
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 или что-то еще, что вы хотите.
Вы можете посмотреть на [этот вопрос] (http://stackoverflow.com/questions/12835577/how-to-convert-stdchronotime-point-to-calendar-datetime-string-with-fraction) , –
Кроме того, Говард Хиннант предоставил [выдающийся учебник] (https://www.youtube.com/watch?v=P32hvk8b13M) в прошлом году на cppcon. – Jeff