I have simple function:
void foo(std::chrono::milliseconds ms) {
std::cout << ms.count() << " milliseconds" << std::endl;
}
And next I'm calling them like this:
int main() {
using namespace std::chrono_literals;
boo(3s);
boo(1h);
boo(100ms);
}
Output is simple:
3000 milliseconds
3600000 milliseconds
100 milliseconds
But, what if I want to use this function like this:
boo(3.5s);
boo(0.5s);
boo(0.3days);
Then I have compile error.
So, I can write function who receive chrono::duration:
template<class T>
void foo(std::chrono::duration<T> duration) {
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() << " milliseconds" << std::endl;
}
And then 3.5s will work, but 1h or 3.5h doesn't work.
So, question, can I write universal function which convert any of 1s/1.s/1m/1.5m/1h/1.5h/etc into milliseconds?
Maybe I can create overloaded operators for chrono::seconds/hours? Or just cast, cast, cast?
The proper function template definition should take the period as a template parameter too:
Or in C++20, don't call
.count()and let it print the unit automatically:I have no clue about the
daysliteral though. Never seen it, but the rest of them will work.Demo