2017-06-19 20 views
5

Bir çeşit std::chrono::duration dönüştürmem gerekiyor, ancak bu tür bir dönüşüm mümkün olmadığında bilmem gerekiyor çünkü değer gösterilemez.duration_cast öğesinde taşma kontrolü nasıl yapılır

Bunu kontrol etmek için standart kütüphanede herhangi bir tesis bulamadık. cppreference page, değer aralık dışı olduğunda ne olacağını belirtmez, yalnızca kayan noktadan tamsayıya dönüşme tanımsız davranış olabilir (benim durumumda tam sayıdan tamsayıya dönüştürmem gerekir).

cevap

2

hiç tek beden uyan tüm çözüm, aralık denetimi için bir double tabanlı duration kullanmaktır pek çok kullanım örneğini uyuyor ancak bir çözüm vardır. Belki bir şey gibi: Benim için

#include <chrono> 
#include <iostream> 
#include <stdexcept> 

template <class Duration, class Rep, class Period> 
Duration 
checked_convert(std::chrono::duration<Rep, Period> d) 
{ 
    using namespace std::chrono; 
    using S = duration<double, typename Duration::period>; 
    constexpr S m = Duration::min(); 
    constexpr S M = Duration::max(); 
    S s = d; 
    if (s < m || s > M) 
     throw std::overflow_error("checked_convert"); 
    return duration_cast<Duration>(s); 
} 

int 
main() 
{ 
    using namespace std::chrono; 
    std::cout << checked_convert<nanoseconds>(10'000h).count() << "ns\n"; 
    std::cout << checked_convert<nanoseconds>(10'000'000h).count() << "ns\n"; 
} 

bu çıkışlar:

36000000000000000ns 
libc++abi.dylib: terminating with uncaught exception of type std::overflow_error: checked_convert 
İlgili konular