2013-02-24 15 views
6

Poniższy kod nie skompilować (g++ 4.7.2):std :: Chrono: dodać niestandardowy okres do time_point

#include <chrono> 

typedef std::chrono::duration<double> double_prec_seconds; 
typedef std::chrono::time_point<std::chrono::system_clock> timepoint_t; 

void do_something(const timepoint_t& tm) 
{ 
    // ... 
} 

int main(int argc, char** argv) 
{ 
    timepoint_t t0 = std::chrono::system_clock::now(); 
    timepoint_t t1 = t0 + std::chrono::seconds(3); 

    // timepoint_t t3 = t0 + double_prec_seconds(3.14); 
    auto t3 = t0 + double_prec_seconds(3.14); 

    do_something(t1); 
} 

Moim problemem jest to, że nie wiem, jaki rodzaj t3 ma. Nie jest to timepoint_t, a nieskomunikowanie linii z wyraźnie podanym typem nie doprowadziłoby do kompilacji. To samo z wywołaniem funkcji: Nie mogę zadzwonić pod numer do_something z t3.

Więc moje pytania to:

  • Dlaczego konwersja powiedzie?
  • Jaki jest najlepszy sposób na uzyskanie podwójnej precyzji w sekundach?

wiem, że mogę korzystać z dodatkowej obsady jak ten

// this works 
timepoint_t t3 = t0 + std::chrono::duration_cast<std::chrono::milliseconds>(double_prec_seconds(3.14)); 

ale chcę, aby tego uniknąć.

Z góry dziękuję!

+1

Wydrukowałem typ t3 przy pomocy typeid (t3) .name(), wypuszczając stdout do C++ filt, i napisałem: std :: chrono :: time_point >> '. Po prostu dla FYI. –

+0

DZIĘKUJEMY za podpowiedź za pomocą narzędzia! Zasadniczo zrobiłem to samo, po prostu bez 'C++ filt' i nie dostałem nic" użytecznego "poza tajemniczą nazwą. 'C++ filt' wydaje się pomóc, nie wiedział tego. –

Odpowiedz

7

konwersja nie powiedzie się, ponieważ nie ma konwersja z

std::chrono::time_point< std::chrono::system_clock, 
         std::chrono::system_clock::duration > 

do

std::chrono::time_point< std::chrono::system_clock, 
         std::chrono::duration<double> > 

Najprostszym sposobem byłoby dać double_prec_seconds jako parametr szablonu do time_point patrz std::chrono::time_point

typedef std::chrono::time_point< std::chrono::system_clock, 
           double_prec_seconds > timepoint_t; 

to już masz Odpowiedni typ dla t3 i do_something.

+0

Idealny! Dziękuję Ci! Próbowałem zapewnić konwersję, ale nie myślałem o zmianie mojego 'typedef'. Mój kod wygląda teraz i działa tak, jak powinien. –

Powiązane problemy