Namespaces
Variants

std::chrono:: duration_cast

From cppreference.net
헤더 파일에 정의됨 <chrono>
template < class ToDuration, class Rep, class Period >
constexpr ToDuration duration_cast ( const std:: chrono :: duration < Rep, Period > & d ) ;
(C++11부터)

std::chrono::duration 을 다른 타입 ToDuration 의 duration으로 변환합니다.

이 함수는 오버로드 해결에 참여하는 조건은 ToDuration std::chrono::duration 의 특수화(specialization)인 경우에만 해당됩니다.

다음을 가정합니다

  • ToRep typename ToDuration :: rep 로 정의하고,
  • ToPeriod typename ToDuration :: period 로 정의하고,
  • CF std:: ratio_divide < Period, ToPeriod > 로 정의하고,
  • CR std:: common_type < Rep, ToRep, std:: intmax_t > :: type 로 정의하고,
  • cr_count static_cast < CR > ( d. count ( ) ) 로 정의하고,
  • cr_num static_cast < CR > ( CF :: num ) 로 정의하고,
  • cr_den static_cast < CR > ( CF :: den ) 로 정의한다.

결과는:

CF :: num
1 아님 1
CF :: den 1 ToDuration ( static_cast < ToRep >
( d. count ( ) ) )
ToDuration ( static_cast < ToRep >
( cr_count * cr_num ) )
아님 1 ToDuration ( static_cast < ToRep >
( cr_count / cr_den ) )
ToDuration ( static_cast < ToRep >
( cr_count * cr_num / cr_den ) )

목차

매개변수

d - 변환할 지속 시간

반환값

d ToDuration 타입의 지속 시간으로 변환합니다.

참고 사항

암시적 변환은 사용되지 않습니다. 컴파일 타임에 하나 이상의 매개변수가 1 인 것으로 알려진 경우 가능한 곳에서는 곱셈과 나눗셈을 피합니다. 계산은 사용 가능한 가장 넓은 타입으로 수행되며, 작업이 완료된 후에만 static_cast 를 사용한 것처럼 결과 타입으로 변환됩니다.

소스 주기가 대상 주기로 정확히 나누어떨어지는 정수 기간 간의 변환(예: 시간에서 분으로) 또는 부동소수점 기간 간의 변환은 일반 캐스트 또는 std::chrono::duration 생성자 를 통해 암시적으로 수행할 수 있으며, duration_cast 는 필요하지 않습니다.

부동 소수점 지속 시간을 정수 지속 시간으로 캐스팅하는 것은 정의되지 않은 동작을 유발합니다 부동 소수점 값이 NaN, 무한대이거나 대상 정수 타입으로 표현하기에 너무 큰 경우에. 그 외의 경우, 정수 지속 시간으로의 캐스팅은 다른 static_cast 에서와 마찬가지로 정수 타입으로의 절삭 변환을 따릅니다.

예제

이 예제는 함수의 실행 시간을 측정합니다.

#include <chrono>
#include <iostream>
#include <ratio>
#include <thread>
void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
    const auto t1 = std::chrono::high_resolution_clock::now();
    f();
    const auto t2 = std::chrono::high_resolution_clock::now();
    // floating-point duration: no duration_cast needed
    const std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
    // integral duration: requires duration_cast
    const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
    // converting integral duration to integral duration of
    // shorter divisible time unit: no duration_cast needed
    const std::chrono::duration<long, std::micro> int_usec = int_ms;
    std::cout << "f() took " << fp_ms << ", or "
              << int_ms << " (whole milliseconds), or "
              << int_usec << " (whole microseconds)\n";
}

가능한 출력:

f() took 1000.14ms, or 1000ms (whole milliseconds), or 1000000us (whole microseconds)

참고 항목

(C++11)
시간 간격
(클래스 템플릿)
동일한 클록에서 다른 지속 시간을 가진 시간 포인트로 변환
(함수 템플릿)
지속 시간을 다른 지속 시간으로 변환 (내림)
(함수 템플릿)
지속 시간을 다른 지속 시간으로 변환 (올림)
(함수 템플릿)
지속 시간을 다른 지속 시간으로 변환 (가장 가까운 값으로 반올림, 동점 시 짝수로)
(함수 템플릿)