2016-02-18 2 views
5

Dans l'exemple à http://en.cppreference.com/w/cpp/chrono la valeur des secondes est obtenue dans un double. C'est le comportement que je veux. Cependant, cela semble reposer sur l'hypothèse implicite que la soustraction du point temporel donne une valeur qui représente les secondes. Je ne trouve rien qui explique pourquoi une durée donne des secondes flottantes quand aucune unité de temps n'est spécifiée. Sans utiliser auto, quelqu'un peut-il montrer comment obtenir explicitement une unité de temps comme des secondes dans un type à virgule flottante, ou me diriger vers une documentation ou une explication expliquant pourquoi la conversion susmentionnée représente des secondes?Obtenir les secondes chrono dans le flotteur

La conversion en question est essentiellement:

std::chrono::time_point<std::chrono::system_clock> start = std::chrono::system_clock::now(); 
std::chrono::time_point<std::chrono::system_clock> end = std::chrono::system_clock::now(); 
std::chrono::duration<double> elapsed_seconds = end-start; // why does this represent seconds as opposed to some other time unit? 
double secondsInDouble = elapsed_seconds.count(); 

Voir les messages suivants pour des exemples de la conversion.

How to get duration, as int milli's and float seconds from <chrono>?

C++ chrono - get duration as float or long long

getting chrono time in specific way

Chrono Timer Not Converting Seconds Properly

Répondre

5

Selon ceci: http://en.cppreference.com/w/cpp/chrono/duration le rapport par défaut pour le second paramètre de modèle est 1:1 secondes signification.

Les autres valeurs sont des rapports relatifs à cela. Par exemple, le ratio pour std::chrono::milliseconds est 1:1000http://en.cppreference.com/w/cpp/numeric/ratio/ratio

Donc cette déclaration:

std::chrono::duration<double> elapsed_seconds = end-start; 

équivaut à:

std::chrono::duration<double, std::ratio<1>> elapsed_seconds = end-start; 

Ce qui est défini comme secondes à partir de laquelle tous les autres rapports sont dérivés.

Quelles que soient les unités end - start définies, elles sont converties en std::ratio<1> comme dans secondes.

Si vous vouliez le temps en millisecondes que vous pourriez faire:

std::chrono::duration<double, std::ratio<1, 1000>> elapsed_milliseconds = end-start; 

Et end - start doit être converti selon le nouveau rapport.

+0

Je vois la partie que j'ai ratée en haut de la référence: 'tick period est une constante rationnelle à la compilation représentant le nombre de secondes d'une tick à la suivante. Donc, étant donné le ratio par défaut de 1: 1, un la période de durée représente toujours une seconde. Merci d'avoir porté cela à mon attention. – taz

+2

'std :: ratio <1, 1000>' peut être remplacé par 'std :: milli'. –