2016-07-25 5 views
0

Mein Titel kann nicht sehr hilfreich sein, ich habe eine Std :: Chrono :: Nanosekunde, aber ich bin gebeten, die zweite und dann die Nanosekunde als andere Werte zu serialisieren in einem JSON.Std :: Chrono berechnen den Unterschied in verschiedenen Verhältnis

Und obwohl meine Struktur gilt:

struct time 
{ 
    ... 
    std::chrono::nanoseconds timepoint; 
}; 

wenn für Sekunden fragte ich

uint32_t sec() const 
{ 
    return std::chrono::duration_cast<std::chrono::seconds>(timepoint_).count(); 
} 

noch, wenn für ns gefragt, möchte ich die Auflösung in Nanosekunden, aber ohne die Sekunden (nur die niedrigstwertigen Werte?), wirft jedoch in Nanosekunden sowohl die Sekunden als auch die höhere Auflösung zurück.

uint64_t nanosec() const 
{ 
    return std::chrono::duration_cast<std::chrono::nanoseconds>(timepoint_).count(); 
} 

Wie kann ich die tatsächlich erhöhte Auflösung berechnen (z. B. die Nanosekunden ohne die tatsächlichen Sekunden)?

+1

Versuchen Sie zuerst, den Sekunden-Zeitpunkt zu nehmen (Ergebnis der Umwandlung vor dem Aufruf von '.count()'), und subtrahieren Sie ihn dann vom aktuellen Zeitpunkt. Der resultierende Zeitpunkt sollte nur die "übrig gebliebenen" Nanosekunden haben. – Xarn

+0

Würde Modding um 1 Milliarde ausreichen? – DeathTails

+0

@Xarn Ich bin ein wenig verwirrt, könnten Sie bitte ein Beispiel geben? –

Antwort

3

Sie können die Sekunden abrufen std::duration_cast zu std::seconds und die Nanosekunden unter Verwendung einer Modulo-Operator:

template <typename T> 
std::pair<T, T> split (std::chrono::duration<T, std::nano> const& duration) { 
    using seconds = std::chrono::duration<T>; 
    return {std::chrono::duration_cast<seconds>(duration).count(), 
      (duration % seconds{1}).count()}; 
} 

Es ist ein gutes Beispiel für this page zeigt die Verwendung von arithmetischen Operatoren auf std::chrono::duration genau zu erreichen, was Sie wollen.

+0

Modulo arbeitet vernünftig auf 'chrono :: duration'? Das werde ich in Zukunft nutzen. – Xarn

+0

@Xarn Es ist durch den Standard definiert, also nehme ich an, es soll normal funktionieren (das ist ein modulo auf zwei 'std :: chrono :: duration' direkt). – Holt

+0

'(Dauer% 1s)' funktioniert auch (in C++ 14). –

1

Benutzer @Xarn bot die Lösung:

auto sec = std::chrono::duration_cast<std::chrono::seconds>(tp); 
auto nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp); 
auto diff = std::chrono::duration_cast<std::chrono::nanoseconds>(nsec - sec).count(); 

verlässt die Nanosekunde Auflösung ohne die Sekunden.

Verwandte Themen