std :: chrono & amp; Boost.Units

Я работаю над дизайном программного обеспечения, в котором я хотел бы использовать Boost.Units, Некоторые из единиц, которые я хотел бы использовать, представляют время, однако я склонен использовать C ++ 11 std::chrono единицы для тех, потому что они стандартные.

Мне интересно, есть ли чистая интеграция между Boost.Units а также chrono или я должен прибегнуть к написанию своих собственных преобразователей и потерять безопасность типов, просто копируя скалярные значения между типами.

Есть ли лучшие практики для этой проблемы?

16

Решение

Если вы просто хотите конвертировать std::chrono Продолжительность до увеличения времени вы можете использовать следующую функцию шаблона:

using time_quantity = boost::units::quantity<si::time, double>;

template<class _Period1, class _Type>
time_quantity toBoostTime( chrono::duration<_Type, _Period1> in)
{
return time_quantity::from_value(double(in.count()) * double(_Period1::num) / double(_Period1::den) );
}

Стоит отметить, что возвращенный time_quantity всегда будет в секундах, и тип хранения будет иметь тип double. Если какие-либо из этих двух проблем, шаблон может быть адаптирован.

Пример:

namespace bu = boost::units;
namespace sc = std::chrono;
using time_quantity_ms = bu::quantity<decltype(bu::si::milli * bu::si::second), int32_t>;

std::cout << "Test 1: " << toBoostTime(sc::seconds(10)) << std::endl;
std::cout << "Test 2: " << toBoostTime(sc::milliseconds(10)) << std::endl;
std::cout << "Test 3: " << static_cast<time_quantity_ms>(toBoostTime(sc::milliseconds(10))) << std::endl;

/* OUTPUT */
Test 1: 10 s
Test 2: 0.01 s
Test 3: 10 ms
1

Другие решения

Это может быть не идеальный ответ, но boost :: chrono предоставляет пример того, как интегрировать его с системой единиц, которую они определяют в сам пример (devel) (версия на момент написания).

По сути, на основе Примеры boost.units для кватернионных и комплексных чисел должна быть возможность определить те же функции для модулей std :: chrono, хотя для новых пользовательских модулей может потребоваться дополнительный код.

Существует также похожий, хотя и немного другой вопрос относительно повышения :: date_time который также может иметь полезную информацию.

Извините, это не полный ответ, но, возможно, это будет началом, которое кто-то другой может завершить!

0