2011-10-25 21 views
22

Aptalca bir problemim var. C++ 11 başlıklarına geçmeye çalışıyorum ve bunlardan biri krono. Ama benim sorunum, zaman operasyonlarının sonucunu cout edemem. Örneğin:std :: chrono ve cout

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

verir: ‘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> >]’ ait argüman 1 başlatılıyor

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

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

geçersiz döküm verir

cevap

20

Hızlı bir google se arch bu sayfayı buldu: bir süreyi yazdırma örneği bulabileceğiniz http://en.cppreference.com/w/cpp/chrono/duration.

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

+0

Bu wiki'yi kullanıyorum, ama hiç bulamadım ... tnx – NoSenseEtAl

+0

Bağlantılı örneğin, şimdiki() iki çağırma arasındaki farkı yazması ve time_since_epoch() içermemesi bakımından dikkat edin.Aslında, time_since_epoch gerçek dönemi belirsiz bırakır (time_point'i aldığınız saate bağlı olarak değişir). Yani, kısaca, yazdırdığınız süre, dönemle ilgili bilgi olmadan, anlamsızdır. –

7

taşındı değil belki t.time_since_epoch().count() istedi Eğer bu döküm beklediğiniz emin?

29

Diğerlerinin de belirttiği gibi, dahili sayıyı almak için count() üye işlevini çağırabilirsiniz.

Bu kitaplığa yeni bir başlık eklemeye çalıştığımı eklemek istedim: <chrono_io>. here belgelenmiştir. Sadece count() kullanarak <chrono_io>'un ana avantajı, derleme zamanı birimlerinin sizin için yazdırılmış olmasıdır. Bu bilgi elbette el ile elde edilebilir, ancak kütüphanenin sizin için sadece ona sahip olması çok daha kolaydır.

Benim için

, sizin örnek:

#include <iostream> 
#include <chrono_io> 

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

Çıkışlar:

147901305796958 nanoseconds 

bu yukarıdaki linkten açık kaynak ve kullanılabilir yapmak için kaynak kodu. İki başlıktan oluşur: <ratio_io> ve <chrono_io> ve 1 kaynak: chrono_io.cpp. Bu kod deneysel olarak kabul edilmelidir. Standart değildir ve neredeyse kesinlikle standartlaştırılmayacaktır. Gerçekten de, LWG'nin ilk yorumları, bu yazılımın “kısa biçim” olarak adlandırdığı şeyin varsayılan çıktısını tercih edeceğini belirtmektedir. '

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"; 

Don: Eğer milisaniye çözünürlükte zamanlamasını istiyorsanız bu bunu nasıl olduğunu

147901305796958 ns 
+0

Benim asıl soruma göre, bir cpp guru olmadığımı tahmin edebilirsin :), ama neden aşırıya kaçmıyorsun time_since_epoch t.time_since_epoch (chrono :: print_unit) – NoSenseEtAl

+1

Şu anda gezegende çok az krono gurusu var. Yani gayet iyisin! :-) Önerilerinizi yanlış anlamış olabilirim, ancak en azından baskı amacıyla, sürenin birimlerini ayarlamanızı önereceğinize benziyor. Bu, istenmeyen dönüşümlerin sessiz bir şekilde gerçekleşmesine neden olabilir, ki bu da chrono'nun tasarımının engellemek için sıkıntıya düştüğü anlamına gelir. Yani farklı süre türleri, yalnızca dönüşüm tarafından yapılan kesme hatası yoksa, dolaylı olarak dönüştürülür. –

+0

ne demek istediğim, işlevi aşırı yüklediğiniz ve aşırı yükün sonuna kadar yapışmış std :: string değerini döndürdüğünüzdür. print_unit yerine print_nano, print_milli veya print_unit ... veya sadece (w) print_units ile (w) print_units ... (aka std :: cout << chrono :: print_units << t.time_ ...) benim amacım sadece baskıyı doğru bir şekilde yapmak için başlık çözümünün dağınık görünmesidir. Ve hamal edenlere cephane verecek ... "zaman ünitesini yazdırmak istiyorsun? Bunun için bir başlık var, BTW 5 yıl için standart olmayacak." :) – NoSenseEtAl

7

:

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

Ve çıkışlar: Bu alternatif çıkış ile elde edilebilir İçerilen başlıklar arasında eklemeyi unutun:

İlgili konular