Este trecho C++ imprime uma duração em ms e horas:
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main() {
auto t0 = high_resolution_clock::now();
this_thread::sleep_for(300ms);
auto t1 = high_resolution_clock::now();
cout << duration<float, milli>{t1-t0}.count() << "\n";
cout << duration<float, ratio<3600>>{t1-t0}.count() << "\n";
}
Existe uma maneira menos complicada e mais concisa de expressar esta duração em várias unidades de tempo? ratio<3600>
parece especialmente desajeitado. Prefiro ter algo hour
nele. Além disso, prefiro uma opção que funcione bem com fmt
a biblioteca atual ( https://fmt.dev/10.2.0/ ). Por exemplo, t1-t0
funciona bem com iostream
, mas não com fmt
.
Passei um tempo observando e experimentando unidades de tempo baseadas em https://en.cppreference.com/w/cpp/chrono/duration e tudo que consegui foram numerosos e longos modelos de vômito. Não tenho ideia de por que alguém decidiu que isso duration<float, hour>
não é um bom análogo de duration<float, milli>
.
chrono tem estes apelidos para representações integrais:
std::chrono::milliseconds
std::chrono::hours
Se você deseja uma representação de ponto flutuante, você mesmo terá que definir aliases semelhantes, por exemplo
Conforme sugerido por Howard, por horas você pode usar
hours::period
o que é mais intuitivo que oratio<3600>
.Isso pode ser feito uma vez e reutilizado.
Ambas as durações funcionam bem com a versão mais recente do {fmt}: https://www.godbolt.org/z/ssorhqMPY .