将双 chrono:: 秒转换为毫秒

Ill*_*ion 5 c++ milliseconds seconds c++-chrono

我有简单的功能:

void foo(std::chrono::milliseconds ms) {
    std::cout << ms.count() << " milliseconds" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

接下来我这样称呼他们:

int main() {
    using namespace std::chrono_literals;

    boo(3s);
    boo(1h);
    boo(100ms);
}
Run Code Online (Sandbox Code Playgroud)

输出很简单:

3000 milliseconds
3600000 milliseconds
100 milliseconds
Run Code Online (Sandbox Code Playgroud)

但是,如果我想像这样使用这个函数怎么办:

boo(3.5s);
boo(0.5s);
boo(0.3days);
Run Code Online (Sandbox Code Playgroud)

然后我编译错误。所以,我可以编写接收的函数chrono::duration

3000 milliseconds
3600000 milliseconds
100 milliseconds
Run Code Online (Sandbox Code Playgroud)

然后3.5s会起作用,但1h3.5h不起作用。那么,问题是,我可以编写通用函数将1s// 1.s/ 1m/ 1.5m/ 1h/ 1.5hetc 中的任何一个转换为毫秒吗?也许我可以创建chrono::seconds/小时的重载运算符?还是只是投、投、投?

Ted*_*gmo 6

正确的函数模板定义也应该将句点作为模板参数:

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";
}
Run Code Online (Sandbox Code Playgroud)

或者在C++20中,不调用.count()并让它自动打印单位:

template <class Rep, class Period>
void boo(std::chrono::duration<Rep, Period> duration) {
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(duration)
              << '\n';
}
Run Code Online (Sandbox Code Playgroud)

但我对字面意思一无所知days。没见过,但其余的都可以。

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
}
Run Code Online (Sandbox Code Playgroud)

演示