Преобразование времени с высоким разрешением в целое (Chrono)

Я хочу получить точность наносекунды с помощью библиотеки хроно, но я не могу понять, как преобразовать std::chrono::high_resolution_clock::now() в long int. Я пробовал это:

#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;
}

Но это дало мне ошибку: error C2440: 'initializing' : cannot convert from 'std::chrono::system_clock::time_point' to 'long' Как я могу преобразовать его в 64-битный int? Если я не могу, то я не вижу, как хроно полезно.

Ответ 1

Следующее работает с GCC 4.8 в 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';

Ответ 2

Сначала преобразуйте точку времени, возвращаемую now(), в продолжительность с известной временной точки. Это может быть либо эпоха часов:

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

или выбранный вами момент времени:

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

Затем вы можете получить количество наносекунд либо путем преобразования и извлечения счета:

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

или путем деления на любую гранулярность, которую вы хотите:

auto nanos = since_epoch / nanoseconds(1);

Как отмечено в комментариях, сделайте это последнее преобразование (которое оставляет систему типа библиотеки Chrono, теряя ценную информацию о том, что означает число), если вам действительно нужна скалярная величина; возможно, потому, что вы взаимодействуете с API, который не использует стандартные типы. Для ваших собственных вычислений типы должны позволять вам выполнять любую значимую арифметику, которая вам нужна.

Ответ 3

Более краткий вариант ответа на nosid:

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