2013-08-02 17 views
10

Chcę być w stanie uzyskać dokładność nanosekund z biblioteką chrono, ale nie mogę wymyślić, jak przekonwertować std::chrono::high_resolution_clock::now() na long int. Próbowałem to:Konwersja czasu zegara wysokiej rozdzielczości na liczbę całkowitą (Chrono)

#include <chrono> 
#include <iostream> 
using namespace std; 

int main() { 
    typedef std::chrono::high_resolution_clock Clock; 

    long int val = Clock::now(); 

    cout << val << endl; 

    cin.ignore(); 
    return 0; 
} 

Ale to dało mi błąd: error C2440: 'initializing' : cannot convert from 'std::chrono::system_clock::time_point' to 'long' Jak mogę przekonwertować go do 64 bitowego int? Jeśli nie mogę, nie widzę, w jaki sposób chrono jest użyteczne.

+2

Jeśli czytasz [dokumentacja] (http://en.cppreference.com/w/cpp/chrono/system_clock/now) będzie zobaczyć funkcja 'now' zwraca obiekt [' time_point'] (http://en.cppreference.com/w/cpp/chrono/time_point) (dokładnie tak, jak mówi komunikat o błędzie). Zobacz link 'time_point' dla przykładu, jak wydrukować czas. Jeśli chcesz czas w sekundach, użyj np. ['to_time_t'] (http://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t). –

+0

Jedną z zalet "" jest bezpieczeństwo typu; dwa przykłady to takie, że punkty czasowe i czas trwania są odrębnymi, niezmiennymi typami, a typy śledzą jednostki dla ciebie, więc nie możesz mylić sekund na milisekundy, itd. – bames53

Odpowiedz

13

następujące prace z GCC 4.8 w systemie Linux:

using namespace std::chrono; 
auto now = high_resolution_clock::now(); 
auto nanos = duration_cast<nanoseconds>(now.time_since_epoch()).count(); 
std::cout << nanos << '\n'; 
+1

To wydrukowało ogromną liczbę ujemną. –

+0

@SusanYanders Nie sądzę, że liczba może zwrócić ujemny – aaronman

+3

@aaronman Cóż, zrobiłem –

3

Najpierw przekonwertować punkt czasowy zwracane przez now() w czasie od znanego punktu czasowego. Może to być zarówno zegara epoka:

auto since_epoch = Clock::now().time_since_epoch(); 

lub jakiś punkt czasowy, który wybrałeś:

auto since_epoch = Clock::now() - my_epoch; 

Następnie można uzyskać liczbę nanosekund albo poprzez przekształcenie i wydobywania Count:

auto nanos = duration_cast<nanoseconds>(since_epoch).count(); 

lub poprzez podzielenie przez ziarnistość cokolwiek chcesz:

auto nanos = since_epoch/nanoseconds(1); 

Jak wspomniano w komentarzach, wykonuj tylko ostatnią konwersję (która opuszcza system typu Chrono, tracąc cenne informacje o tym, co oznacza liczba), jeśli naprawdę potrzebujesz ilości skalarnej; być może dlatego, że wchodzisz w interakcję z API, który nie używa standardowych typów. Dla własnych obliczeń typy powinny umożliwiać wykonanie dowolnej znaczącej arytmetyki, której potrzebujesz.

+1

'auto nanos = since_epoch/nanoseconds (1);' Należy podkreślić, że powoduje to skalar jednostkowy. Jeśli nie potrzebujesz wartości bez jednostki, najlepiej trzymać się typów chrono jednostek. – bames53

+0

@ bames53: Rzeczywiście; ale w tym przypadku skalar bez jednostek jest dokładnie tym, o co prosi OP, i dokładnie to, co daje również "count()". –

+0

Pewnie, że nowi użytkownicy powinni być poinformowani o zaletach silnego pisania w kontekście '' i pokazali idiomatyczne '' 'użycie. Nowi użytkownicy często pytają o słabsze typy po prostu dlatego, że są do tego przyzwyczajeni w innych bibliotekach czasu, nie dlatego, że faktycznie potrzebują słabych typów. – bames53

0

bardziej zwięzła wersja odpowiedzi nosid za:

long int time = static_cast<long int>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); 
Powiązane problemy