2011-10-25 3 views
22

나는 바보 같은 문제가있다. 나는 C++ 11 헤더로 전환하려고하고 그 중 하나는 크로노입니다. 하지만 제 문제는 시간 작업의 결과가 나올 수 없다는 것입니다. 예를 들어 :std :: chrono and 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> >]’의 인수 하나를 초기화

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

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

가 잘못 캐스트를 제공합니다

답변

20

빠른 google se arch가이 페이지를 찾았습니다 : http://en.cppreference.com/w/cpp/chrono/duration, 여기서 기간 인쇄의 예를 찾을 수 있습니다.

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

+0

그 위키를 사용하지만, 결코 발견하지 못했습니다 ... tnx – NoSenseEtAl

+0

now()의 두 호출 사이의 차이를 인쇄하고 time_since_epoch()를 포함하지 않으므로 링크 된 예제가 다르다는 점에 유의하십시오.실제로 time_since_epoch는 실제 에포크를 지정하지 않습니다 (time_point가있는 시계에 따라 다릅니다). 즉, 인쇄하는 기간은 신기원에 관한 정보가 없으면 의미가 없습니다. –

7

로 이동 없어 어쩌면 당신은 t.time_since_epoch().count()을 원하는 당신이 캐스트에서 기대하는 무엇인지?

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 

이 위의 링크에서 오픈 소스로 볼 수 있습니다 수행하는 소스 코드입니다. 두 개의 헤더 (<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 전문가가 아닌 것 같아요. :)하지만 왜 당신은 시간 초과 근무를하지 않습니까? t.time_since_epoch (chrono :: print_unit) – NoSenseEtAl

+1

현재이 행성에는 거의 크로노 전문가가 없습니다. 그래서 당신은 잘하고 있어요! :-) 나는 당신의 제안을 오해했을지도 모릅니다. 적어도 인쇄 목적으로, 당신은 지속 시간의 단위를 설정하는 것이 좋습니다. 이로 인해 부정확 한 변환이 자동으로 발생하여 크로노의 디자인이 막히기가 어려울 수 있습니다. 나는. 다른 지속 시간 유형은 변환에 의한 절단 오류가없는 경우에만 내재적으로 변환됩니다. –

+0

내가 의미하는 바는 함수에 오버로드가 발생하고 오버로드가 std :: string을 반환한다는 것입니다. 또는 print_nano, print_milli 또는 심지어 print_unit 를 가지고있는 print_unit 대신에 다른 매개 변수를 가질 수도 있습니다. 또는 print_units ... (일명 std :: cout)을 사용하여 cout을 업데이트 (w)합니다. << chrono :: print_units << t.time_ ...) 요점은 단지 인쇄가 제대로 이루어 지도록하기위한 헤더 솔루션이 더러워 보인다는 것입니다. 그리고 싫어하는 사람들에게 탄약을 줄 것입니다 ... "시간 단위를 인쇄하고 싶습니까? 헤더가 있습니다. BTW는 5 년 동안 표준화되지 않았습니다." :) – NoSenseEtAl

7

:

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

그리고 출력이 다른 출력을 얻을 수있다 포함 된 헤더 사이에 추가하는 것을 잊지 마십시오 :

#include <chrono> //timing 
관련 문제