2017-02-28 3 views
0

J'ai été à la recherche de cela, mais je n'ai pas trouvé de solution au problème exact.En C++ std, comment choisir la durée de chronos pendant l'exécution

En résumé, existe-t-il un moyen de définir par ordinateur la durée d'une variable std :: chronos? Prenons par exemple le morceau de code suivant:

auto timed = std::chrono::duration_cast<std::chrono::microseconds>(t1-t0).count(); 

J'utilise que dans une classe personnalisée Timer qui mesure la durée d'exécution de code pour certaines fonctions. Ce que j'essaye de faire est de créer un switch par lequel une came définissez si les résultats devraient être stockés comme microseconds, milliseconds ou seconds.

Quel serait le moyen d'atteindre cela en C++?

+2

vous pouvez toujours sauvegarder le résultat le plus élevé de résolution, et le convertir quand quelqu'un le demande dans une résolution inférieure –

Répondre

0

Vous pouvez faire quelque chose de similaire à ceci (supposons sc est std::chrono). Comme vous pouvez le voir le casting est un paramètre de modèle (un paramètre de compilation):

class Timer { 
    sc::time_point<sc::steady_clock> _start; 

    Timer() : _start(sc::steady_clock::now()) { 
    } 

    template <class Unit> 
    int getElapsed() { 
     return sc::duration_cast<Unit>(sc::steady_clock::now() - _start).count(); 
    } 
}; 

Utilisation:

Timer t; 
... 
t.elapsed<sc::milliseconds>(); 

Maintenant, si vous voulez un simple commutateur d'unités à l'exécution, tout simplement envelopper votre fonction de modèle dans une fonction qui instancie votre fonction Timer::getElapsed avec la distribution de vous appropriés et, fait au moins pour les cas simples:

enum class UnitCount { ms, s }; 

int Timer::getElapsedInUnits(UnitCount c) { 
    switch (c) { 
     case UnitCount::ms: 
     return this->getElapsed<sc::milliseconds>(); 
     case UnitCount::s 
     ... 
    } 
} 
+1

Merci, bonne solution élégante –