如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`

Gam*_*ads 4 c++ boost boost-asio c++11 c++-chrono

我正在使用 boost::asio::deadline_timer 像这样async_readtcp socket上的操作之前设置一些超时。我正在使用boost 1.61

long time_out_millis = 2000;
boost::asio::deadline_timer theTimer(theSocket.get_io_service(), boost::posix_time::milliseconds(time_out_millis));
Run Code Online (Sandbox Code Playgroud)

问题:
我的代码的其他部分使用std::chrono::milliseconds. 我想使用std::chrono而不是"long time_out_millis"& 如果可能的话使用std::chrono::milliseconds而不是boost::posix_time::milliseconds. 我怎样才能做到这一点?

问题:
那么,我如何std::chrono::milliseconds在这里使用?有没有办法从std::chrono::millisecondsto投射boost::posix_time::milliseconds

seh*_*ehe 7

直接解决duration_cast<>::

using namespace std::chrono;
using namespace std::chrono_literals; 

boost::posix_time::seconds(duration_cast<seconds>(2s).count());
Run Code Online (Sandbox Code Playgroud)

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

更好的消息

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

#include <boost/asio/high_resolution_timer.hpp>
Run Code Online (Sandbox Code Playgroud)

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

注意这会改变你的

long time_out_millis = 2000;
Run Code Online (Sandbox Code Playgroud)

进入类似的东西

Clock::duration timeout = 2000ms;
Run Code Online (Sandbox Code Playgroud)