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:
template <class Rep, class Period>
void boo(std::chrono::duration<Rep, Period> duration) {
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(duration)
.count()
<< " milliseconds\n";
}
Or in C++20, don't call .count()
and let it print the unit automatically:
template <class Rep, class Period>
void boo(std::chrono::duration<Rep, Period> duration) {
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(duration)
<< '\n';
}
I have no clue about the days
literal though. Never seen it, but the rest of them will work.
int main() {
using namespace std::chrono_literals;
boo(3s);
boo(1h);
boo(100ms);
boo(3.5s);
boo(0.5s);
boo(std::chrono::days(1) * 0.3); // what I got working
}