Как преобразовать `std::chrono::milliseconds` в `boost::posix_time::milliseconds`

Я использую boost::asio::deadline_timer, чтобы установить тайм-аут перед операцией async_read на сокете TCP. Я использую 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?


person TheWaterProgrammer    schedule 29.11.2017    source источник


Ответы (1)


Прямое решение: duration_cast<>:

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

boost::posix_time::seconds(duration_cast<seconds>(2s).count());

Все равно нехорошо. Но это твой ключ.

ЛУЧШИЕ НОВОСТИ

В любом сценарии С++ 11 или выше просто

#include <boost/asio/high_resolution_timer.hpp>

И наслаждайтесь таймером, полностью параметризованным на std::chrono снизу вверх. Нет больше несоответствия импеданса:

Жить на 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;
person sehe    schedule 29.11.2017
comment
спасибо за такой подробный ответ. ты имеешь в виду Clock::duration или std::chrono::system_clock::duration ? - person TheWaterProgrammer; 30.11.2017
comment
твой ответ хорош. я понял, но не уверен, что вы имеете в виду под Clock::duration timeout = 2000ms;. это не компилируется. попытка с std::chrono::system_clock::duration timeout = 2000ms дает некоторые ошибки компиляции, связанные с длительностью - person TheWaterProgrammer; 30.11.2017
comment
Clock будет typedef для std::chrono::high_resolution_clock - person sehe; 30.11.2017
comment
в прямом решении не должно быть seconds вместо milliseconds? boost::posix_time::milliseconds(duration_cast<milliseconds>(2s).count()); - person Quokka; 28.05.2021
comment
@Quokka Думаю, да. Ваше здоровье. Хотя сейчас я бы написал duration / 1s или, например, duration / 1.0ms и т. д. Я думаю, - person sehe; 29.05.2021