2 votes

std::chrono::duration peut être initialisé par des secondes, mais pas par des millisecondes ?

Travaux : std::chrono::duration<unsigned long long> test1 = std::chrono::seconds(1);

Ça ne marche pas : std::chrono::duration<unsigned long long> test2 = std::chrono::milliseconds(1);

Pourquoi cette différence ? La durée n'a-t-elle pas une granularité suffisante en interne ?

Quelle est la meilleure façon d'initialiser une durée à partir d'une valeur en millisecondes ?

7voto

Xirema Points 677

std::chrono::duration La liste de paramètres du modèle de l'utilisateur prend deux arguments : le type de données sous-jacentes et un paramètre de type std::ratio argument représentant l'exposant de la durée. Les types tels que std::chrono::seconds y std::chrono::milliseconds sont des spécialisations de ce modèle, utilisant std::chrono::duration<int64_t, std::ratio<1>> y std::chrono::duration<int64_t, std::ratio<1, 1000>> respectivement.

Si vous ne fournissez pas un std::ratio au type, il prendra par défaut la valeur std::ratio<1> .

Par conséquent, votre type de durée personnalisé prend implicitement la forme suivante std::chrono::duration<unsigned long long, std::ratio<1>> ce qui en fait presque équivalent à std::chrono::seconds (la seule différence étant la valeur non signée plutôt qu'une valeur signée), mais parce que son rapport est plus élevé que le rapport fourni à std::chrono::milliseconds le modèle de classe interdit la conversion affectation/traw. Dans ce cas, si vous voulez que l'assignation passe, vous devez explicitement la couler :

typedef std::duration<unsigned long long> my_duration;
//my_duration test1 = std::chrono::milliseconds(1);//Forbidden
my_duration test1 = std::chrono::duration_cast<my_duration>(std::chrono::milliseconds(1)); //Permitted, will be truncated
my_duration test2 = std::chrono::duration_cast<my_duration>(1ms); //Permitted, may be easier to read

Le site std::ratio représente la taille du tick de la durée. Plus la taille du tick est petite, plus le nombre sous-jacent représentant la durée sera grand. Par exemple :

using seconds = std::chrono::seconds; //std::duration<int64_t, std::ratio<1,1>>
using milliseconds = std::chrono::milliseconds; //std::duration<int64_t, std::ratio<1,1000>>
using nanoseconds = std::chrono::nanoseconds; //std::duration<int64_t, std::ratio<1,1000000000>>

seconds time1 = 5s; //underlying integer value is 5.
milliseconds time2 = 5ms; //underlying integer value is 5.
time2 = time1; //underlying integer value for time2 is 5000, for time1 is still 5.
time2 = 17ms; //underlying integer value is 17.
//time1 = time2; //forbidden; tick size of time2 is smaller than time1
time1 = std::chrono::duration_cast<seconds>(time2); 
//underlying integer value for time1 is 0, due to truncation; time2 is still 17.
nanoseconds time3 = 5ms; //underlying integer value is 5000000.
time1 = 2s; //underlying integer value is 2.
time3 = time1; //underlying integer value is 2000000000.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X