2013-08-02 9 views
10

クロノライブラリでナノ秒の精度を得ることができますが、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に変換することができますどのように?私ができなければ、クロノがどのように役立つか分かりません。

あなたはSTDを使用することができます
+2

あなたは[ドキュメント](http://en.cppreference.com/w/cpp/chrono/system_clock/now)を読めばあなたが表示されます'now'関数は(' error_メッセージと同様に)['time_point'](http://en.cppreference.com/w/cpp/chrono/time_point)オブジェクトを返します。時間を印刷する方法の例については、 'time_point'リンクを参照してください。時間を秒単位で指定する場合は、たとえばを使用します。 ['to_time_t'](http://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)。 –

+0

」の利点の1つは、タイプセーフです。 2つの例は、時間点と時間間隔が別々の交換不可能な種類であり、種類によって単位が追跡されるため、ミリ秒単位で秒数を混同することはできません。 – bames53

答えて

13

次作品:

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

これは巨大な負の数を表示します。 –

+0

@SusanYandersカウントが負の値を返すとは思わない – aaronman

+3

@aaronmanそれは –

3

まず、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とやり取りしているからです。あなた自身の計算のために、必要な意味のある算術演算を実行できるようにするべきです。

+1

'auto nanos = since_epoch/nanoseconds(1);'これは、無単位のスカラが得られることを指摘しておきます。実際に無単位の値が必要な場合を除き、クロノのユニットセーフなタイプを使用することをお勧めします。 – bames53

+0

@ bames53:確かに;この場合、単位のないスカラーはOPが要求しているものであり、まさに 'count()'があなたに与えるものです。 –

+0

確かに新しいユーザーには、強いタイピングの利点について、「」という文脈で告知され、慣用的な「」の使用法が示されます。新しいユーザーはしばしば弱いタイプを求めます。これは、実際に弱いタイプを必要とするのではなく、他の時間ライブラリに慣れているからです。 – bames53

0

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()); 
関連する問題