2013-02-24 5 views
6

Der folgende Code time_point nicht kompiliert (g++ 4.7.2):std :: Chrono: add benutzerdefinierte Dauer

#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); 
} 

Mein Problem ist, dass ich nicht weiß, welche Art t3 hat. Es ist nicht timepoint_t, und das Unkommentieren der Zeile mit dem explizit angegebenen Typ würde nicht kompiliert. Das Gleiche gilt für den Funktionsaufruf: Ich kann do_something nicht mit t3 anrufen.

Also meine Fragen sind:

  • Warum versagt die Umwandlung?
  • Was ist der beste Weg, um Sekunden mit doppelter Genauigkeit zu haben?

Ich weiß, dass ich einen zusätzlichen Guss wie diese

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

verwenden kann, aber ich möchte, dies zu vermeiden.

Vielen Dank im Voraus!

+1

Ich druckte den Typ von t3 mit typeid (t3) .name(), Piping stdout zu C++ filt, und es sagte 'std :: chrono :: time_point >> '. Nur zu deiner Information. –

+0

DANKE für den Hinweis mit dem Werkzeug! Ich habe im Grunde genommen das Gleiche gemacht, nur ohne 'C++ filt' und habe nichts" nützliches "außer einem kryptischen Namen. 'C++ filt' scheint zu helfen, wusste das nicht. –

Antwort

7

Die Umwandlung fehlschlägt, weil es keine Umwandlung von

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

zu

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

Der einfachste Weg zu geben double_prec_seconds als Template-Parameter zu time_point sein würde, sehen std::chrono::time_point

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

dann hast du schon th Der richtige Typ für t3 und do_something.

+0

Perfekt! Vielen Dank! Ich habe versucht, eine Konvertierung bereitzustellen, habe aber nicht daran gedacht, meine 'Typedef' zu ändern. Mein Code sieht jetzt aus und funktioniert wie beabsichtigt. –