2016-07-25 3 views
0

내 제목은별로 도움이되지 않을 수 있습니다, 나는 std :: chrono :: nanosecond,하지만 serialise하고 두 번째, 그리고 다른 값으로 nanosecond를 제공하도록 요청합니다 JSON에서.std :: chrono 다른 비율의 차이를 계산하십시오

그래서 내 구조체는 보유하고 있지만 :

struct time 
{ 
    ... 
    std::chrono::nanoseconds timepoint; 
}; 

(만 나는 아직

uint32_t sec() const 
{ 
    return std::chrono::duration_cast<std::chrono::seconds>(timepoint_).count(); 
} 

을 나노초에 대해 물었을 때, 나는 나노초의 해상도를 원하는 초를 요구하지만, 초없는 경우 최하위 값은?) 그러나 나노초 단위의 캐스팅은 초와 더 높은 해상도를 반환합니다.

uint64_t nanosec() const 
{ 
    return std::chrono::duration_cast<std::chrono::nanoseconds>(timepoint_).count(); 
} 

실제 증가 된 해상도 (예 : 실제 초가없는 나노초)는 어떻게 계산할 수 있습니까?

auto sec = std::chrono::duration_cast<std::chrono::seconds>(tp); 
auto nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp); 
auto diff = std::chrono::duration_cast<std::chrono::nanoseconds>(nsec - sec).count(); 

은 초없이 나노초 해상도를 잎 :

+1

먼저 초 타임 포인트 ('.count() '를 호출하기 전에 캐스트 결과)를 취한 다음 실제 시간 지점에서 빼십시오. 결과 시간대에는 "남은 시간"나노초 만 있어야합니다. – Xarn

+0

10 억으로 충분합니까? – DeathTails

+0

@Xarn 약간 혼란 스럽네요, 예를 들어 주시겠습니까? –

답변

3

당신은 모듈로 연산자를 사용하여 std::secondsstd::duration_cast를 사용하여 초와 나노초를 검색 할 수 있습니다

template <typename T> 
std::pair<T, T> split (std::chrono::duration<T, std::nano> const& duration) { 
    using seconds = std::chrono::duration<T>; 
    return {std::chrono::duration_cast<seconds>(duration).count(), 
      (duration % seconds{1}).count()}; 
} 

정확히 당신이 원하는 것을 달성하기 위해 std::chrono::duration에 산술 연산자의 사용을 보여주는 this page에 좋은 예입니다.

+0

Modulo는'chrono :: duration'에서 제대로 작동합니까? 그걸 미래에 쓸거야. – Xarn

+0

@Xarn 표준에 의해 정의되었으므로 위의 두 개의 std :: chrono :: duration에 직접 modulo가 적용됩니다. – Holt

+0

'(duration % 1s)'도 (C++ 14에서는) 작동합니다. –

1

사용자 @Xarn 솔루션을 제공했다.

관련 문제