2011-10-25 17 views
22

私は愚かな問題があります。私はC++ 11のヘッダーに切り替えようとしており、そのうちの1つはクロノです。しかし、私の問題は、私は時間の操作の結果を説明することができないということです。たとえば:std :: chronoとcout

auto t=std::chrono::high_resolution_clock::now(); 
cout<<t.time_since_epoch(); 

が与える:‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’の引数1を初期化する

を... /usr/include/c++/4.6/ostream

cout<<(uint64_t)t.time_since_epoch(); 

は無効なキャストを与えます

答えて

20

すばやくgoogle seアーチはこのページを見つけました:http://en.cppreference.com/w/cpp/chrono/duration、期間の印刷の例が見つかります。

編集:それは多分あなたはt.time_since_epoch().count()を望んでいた、あなたはこのキャストに期待するかわからhttp://en.cppreference.com/w/cpp/chrono/duration/duration_cast

+0

私はそのwikiを使っていますが、見つけたことはありません... tnx – NoSenseEtAl

+0

リンクされた例は、now()の2つの呼び出しの違いを表示し、time_since_epoch()は含まれていません。実際、time_since_epochは実際のエポックを未定義にしています(time_pointを取得したクロックに依存します)。要するに、あなたが印刷している期間は、エポックについての情報を伴わずに意味のないものです。 –

7

しないように移動してしまいましたか?

29

他にも述べたように、count()メンバー関数を呼び出して内部カウントを取得することができます。

このライブラリに新しいヘッダー:<chrono_io>を追加しようとしています。これは文書番号hereです。 <chrono_io>の主な利点は、count()を単に使用していることです。コンパイル時の単位が出力されます。もちろん、この情報は手動で取得することもできますが、ライブラリを持たせる方がはるかに簡単です。私にとって

、あなたの例:

#include <iostream> 
#include <chrono_io> 

int main() 
{ 
    auto t = std::chrono::high_resolution_clock::now(); 
    std::cout << t.time_since_epoch() << '\n'; 
} 

出力:これを行うには

147901305796958 nanoseconds 

ソースコードはオープンソースと上記のリンクで入手可能です。 2つのヘッダー:<ratio_io><chrono_io>と1つのソース:chrono_io.cppで構成されています。

このコードは実験的に考慮する必要があります。それは標準ではなく、ほぼ確実に標準化されることはありません。実際、LWGからの予備的なコメントは、デフォルトの出力をこのソフトウェアが「短い形式」と呼ぶものにすることを望んでいることを示しています。 「

auto t1 = std::chrono::high_resolution_clock::now(); 
//process to be timed 
auto t2 = std::chrono::high_resolution_clock::now(); 
std::cout << "process took: " 
    << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() 
    << " milliseconds\n"; 

ドン:あなたはミリ秒単位の分解能でタイミングをしたい場合、これはあなたがそれを行うことができる方法である

147901305796958 ns 
+0

私のオリジナルの質問では、私はcpp教祖ではないと推測することができます:)なぜ、あなたは時間を過ごしていないのですか?time_since_epoch t.time_since_epoch(chrono :: print_unit) – NoSenseEtAl

+1

現時点では惑星にはほとんどクロノ指導者がいません。あなたはうまくやっています! :-)私はあなたの提案を誤解しているかもしれませんが、印刷目的のために、期間の単位を設定するように勧めているようです。これは、不正確な変換が静かに起こる可能性があり、クロノのデザインが防止するのに苦労しています。私。異なる継続時間型は、変換によって切り捨てエラーがない場合にのみ暗黙的に変換されます。 –

+0

私はあなたが関数をオーバーロードし、そのオーバーロードがstd :: stringを返すことを意味しています。 print_nano、print_milli、さらにはprint_unit ...またはprint_units(別名:std :: cout)を取るためにcoutを更新する(w) << chrono :: print_units << t.time_ ...)私の指摘は、ちょうど印刷が正しく行われるようにするためのヘッダー解決策が乱雑に見えることです。そして、嫌悪者に弾薬を与えるだろう... "あなたは時間単位を印刷したいですか?それのためのヘッダがあります、それは5 yのために標準化されていません。 :) – NoSenseEtAl

7

std::cout << std::chrono::duration_fmt(std::chrono::symbol) 
      << t.time_since_epoch() << '\n'; 

そして出力:この代替出力を用いて得ることができます含まれているヘッダーに追加することを忘れないでください。

#include <chrono> //timing 
関連する問題