11

std::chrono::high_resolution_clock::now()chrono ライブラリでナノ秒の精度を取得できるようにしたいのですが、に変換する方法がわかりません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に変換できますか? それができない場合、クロノがどのように役立つかわかりません。

4

4 に答える 4

19

以下は、Linux 上の GCC 4.8 で動作します。

using namespace std::chrono;
auto now = high_resolution_clock::now();
auto nanos = duration_cast<nanoseconds>(now.time_since_epoch()).count();
std::cout << nanos << '\n';
于 2013-08-02T17:45:21.427 に答える
4

まず、によって返され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 を操作していることが原因です。独自の計算では、型によって、必要な意味のある演算を実行できる必要があります。

于 2013-08-02T18:25:21.453 に答える
2

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());
于 2015-10-29T21:39:51.883 に答える
-3

std::chrono::duration_cast を使用できます。

http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

于 2013-08-02T17:40:49.420 に答える