【问题标题】:How to cast `std::chrono::milliseconds` to `boost::posix_time::milliseconds`如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`
【发布时间】:2017-11-29 22:53:51
【问题描述】:

我正在使用 boost::asio::deadline_timer 来在 tcp 套接字 上的 async_read 操作之前设置一些超时。我正在使用 boost 1.61

long time_out_millis = 2000;
boost::asio::deadline_timer theTimer(theSocket.get_io_service(), boost::posix_time::milliseconds(time_out_millis));

问题:
我的代码的其他部分使用std::chrono::milliseconds。我想使用std::chrono 而不是"long time_out_millis" 并且如果可能的话使用std::chrono::milliseconds 而不是boost::posix_time::milliseconds。我该怎么做?

问题:
那么,我怎样才能在这里使用std::chrono::milliseconds?有没有办法从std::chrono::milliseconds 转换为boost::posix_time::milliseconds

【问题讨论】:

    标签: c++ c++11 boost boost-asio chrono


    【解决方案1】:

    直接解决:duration_cast<>

    using namespace std::chrono;
    using namespace std::chrono_literals; 
    
    boost::posix_time::seconds(duration_cast<seconds>(2s).count());
    

    还是不好看。但这是你的钥匙。

    好消息

    在任何 c++11 或更高版本的场景中,只需

    #include <boost/asio/high_resolution_timer.hpp>
    

    享受一个从下到上在std::chrono 上完全参数化的计时器。不再有阻抗失配:

    Live On Coliru

    #include <boost/asio/high_resolution_timer.hpp>
    using namespace std::chrono_literals;
    
    int main() {
        boost::asio::io_service svc;
    
        boost::asio::high_resolution_timer tim(svc);
    
        tim.expires_from_now(1s);
        tim.expires_from_now(100ms);
        tim.expires_from_now(3h);
        tim.expires_from_now(15'000us);
        tim.expires_from_now(15'000'000ns);
    }
    

    注意这会改变你的

    long time_out_millis = 2000;
    

    进入类似的东西

    Clock::duration timeout = 2000ms;
    

    【讨论】:

    • 感谢您提供如此详细的答案。你的意思是Clock::duration 还是std::chrono::system_clock::duration
    • 你的回答很好。我明白了,但不确定您所说的 Clock::duration timeout = 2000ms; 是什么意思。那不编译。尝试使用 std::chrono::system_clock::duration timeout = 2000ms 会产生一些与持续时间相关的编译错误
    • Clock 将是 std::chrono::high_resolution_clock 的类型定义
    • 在直接解决方案中,seconds 不应该是milliseconds 吗? boost::posix_time::milliseconds(duration_cast&lt;milliseconds&gt;(2s).count());
    • @Quokka 我想是的。干杯。虽然这些天我会写duration / 1s 或例如duration / 1.0ms 等我想,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多