почему std::chrono::duration основано на секундах

Я изучаю библиотеку <chrono>, и, учитывая класс std::chrono::duration, есть ли какая-то конкретная причина основывать ее на секундах? Например, переменная для хранения секунд будет

chrono::duration<int> two_seconds(2);

и все другие промежутки времени требуют соотнесения их с секундами, например

chrono::duration<int, ratio<60>> two_minutes(2);
chrono::duration<int, ratio<1, 1000>> two_milliseconds(2);
chrono::duration<int, ratio<60 * 60 * 24>> two_days(2); 

Есть ли причины основывать продолжительность на секундах, а не на минутах, часах и т. д.?


person Wojtek    schedule 09.01.2015    source источник
comment
Секунды являются физической основой для значений длительности времени. Может в этом причина?   -  person πάντα ῥεῖ    schedule 09.01.2015
comment
Если бы это была любая другая единица, задали бы вы соответствующий вопрос?   -  person Kerrek SB    schedule 09.01.2015
comment
Он должен быть основан на чем-то, так как он хранится как целочисленное значение и отношение (интегралов). Что еще посоветуете в качестве базового? Секунды — наиболее естественный вариант, так как это единица СИ для времени.   -  person leemes    schedule 09.01.2015
comment
Если бы его нужно было передать как параметр шаблона, как бы эти типы были определены? Я думаю, используя отношение к какой-то базовой единице. И это именно то, что chrono::duration делает сам по себе. Вы также можете использовать миллисекунды в качестве базы, если используете тип std::chrono::milliseconds (который определяется тем, что вы уже разместили во второй строке кода)   -  person leemes    schedule 09.01.2015
comment
по какой-либо причине... не в минутах, часах и т. д.? Благодаря leap секунды, минуты и часы не имеют постоянной длительности.   -  person Drew Dormann    schedule 24.04.2017


Ответы (1)


Секунды выбраны потому, что это основная единица измерения времени как в системе СИ, так и в науке в целом.
Даже американцы используют секунды, а не что-то вроде микродней.

почему этот базовый промежуток времени не является еще одним параметром шаблона для класса продолжительности

Это так, поскольку вы можете указать typedef для соотношений, и некоторые из них включены в стандарт.

#include <chrono>

std::chrono::duration<int, minutes> two_minutes(2);            // Standard
std::chrono::duration<int, milliseconds> two_milliseconds(2);  // Standard

Если вам нужно больше, их легко добавить:

typedef std::ratio<60 * 60 * 24> days;
typedef std::ratio<756, 625> microfortnights;

std::chrono::duration<int, days> two_days(2); 
std::chrono::duration<int, microfortnights> two_weeks(1000000); 
person molbdnilo    schedule 09.01.2015
comment
Даже американцы используют секунды, а не что-то вроде микродней. +1 за это :) - person DarkWanderer; 09.01.2015
comment
Стандарт уже включает такие вещи, как std::chrono::milliseconds. См. раздел «Типы помощников» на этой странице. - person Steve; 09.01.2015
comment
@Steve Ой, я должен был проверить и не поверить на слово OP. - person molbdnilo; 09.01.2015
comment
Никогда не рано начинать готовиться к первому апреля... using microfortnights = duration<long, std::ratio<756,625>>; ;-) - person Howard Hinnant; 10.01.2015
comment
@HowardHinnant есть правило Даффа, которое гласит, что пи секунд - это наностолетие. - person TemplateRex; 11.01.2015
comment
@TemplateRex: 3944619/1250000 == 3,1556952 секунды. Неплохо! :-) - person Howard Hinnant; 11.01.2015