2016-02-18 12 views
5

Nell'esempio http://en.cppreference.com/w/cpp/chrono il valore dei secondi viene ottenuto in un double. Questo è il comportamento che voglio. Tuttavia, questo sembra basarsi sul presupposto implicito che la sottrazione del punto temporale produce un valore che rappresenta secondi. Non riesco a trovare nulla che spieghi perché una durata produce secondi in virgola mobile quando non viene specificata alcuna unità temporale. Senza utilizzare auto, qualcuno può mostrare come ottenere in modo esplicito un'unità di tempo come secondi in un tipo a virgola mobile o indirizzarmi alla documentazione o alla spiegazione del perché la conversione di cui sopra rappresenta i secondi?Ottiene il cronometro in virgola mobile

La conversione in questione è essenzialmente:

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(); 

Vedi le seguenti posti per esempi di conversione.

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

risposta

5

Secondo questa: http://en.cppreference.com/w/cpp/chrono/duration il rapporto di default per il secondo parametro di template è 1:1 significato secondi.

Altri valori sono relativi a questo. Ad esempio il rapporto per std::chrono::milliseconds è 1:1000http://en.cppreference.com/w/cpp/numeric/ratio/ratio

Quindi questa dichiarazione:

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

è equivalente a:

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

che è definito per essere secondi da cui derivano tutti gli altri rapporti.

Qualunque siano le unità end - start sono definiti vengono convertiti a std::ratio<1> come in secondi.

Se si voleva il tempo in millisecondi che si possa fare:

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

E end - start dovrebbe essere convertito in base al nuovo rapporto di.

+0

Vedo la parte che ho perso nella parte superiore del riferimento: il periodo di tick è una costante razionale in fase di compilazione che rappresenta il numero di secondi da un segno di spunta al successivo. Quindi, dato il rapporto predefinito di 1: 1, un il periodo di durata rappresenta sempre un secondo. Grazie per avermelo fatto notare. – taz

+2

'std :: ratio <1, 1000>' può essere sostituito con 'std :: milli'. –