c++c++-chronomillisecondsseconds

Casting double chrono::seconds into millisecond


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?


Solution

  • 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
    }
    

    Demo