c++ boost c++11 chrono boost-units

c++ - std:: chrono & Boost.Units



c++11 boost-units (2)

Puede que esta no sea una respuesta perfecta, pero boost :: chrono proporciona un ejemplo de cómo integrarlo con un sistema de unidades que definen en el propio ejemplo (devel) ( versión en el momento de la escritura ).

Esencialmente, basado en los ejemplos boost.units para cuaterniones y números complejos , debería ser posible definir las mismas funciones para las unidades std :: chrono, aunque puede requerir un código adicional para las nuevas unidades definidas por el usuario.

También hay una stackoverflow.com/questions/4910373/… similar, aunque ligeramente diferente stackoverflow.com/questions/4910373/… que también puede tener información útil.

Lo siento, esta no es una respuesta completa, ¡pero quizás sea un comienzo que otra persona pueda completar!

Estoy trabajando en un diseño de software en el que me gustaría aprovechar Boost.Units . Algunas de las unidades que me gustaría usar representan el tiempo, sin embargo, me inclino a usar las unidades C ++ 11 std::chrono para aquellas ya que son estándar.

Me pregunto si hay una integración limpia entre Boost.Units y chrono o si tengo que recurrir a escribir mis propios convertidores y perder la seguridad de tipos simplemente copiando los valores escalares entre los tipos.

¿Existen buenas prácticas para este problema?


Si solo desea convertir la duración de std::chrono en una cantidad de tiempo de impulso, puede utilizar la siguiente función de plantilla:

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) ); }

Una cosa a tener en cuenta es que la cantidad de tiempo devuelta siempre estará en segundos y el tipo de almacenamiento será de tipo doble. Si alguno de esos dos es un problema, la plantilla se puede adaptar.

Ejemplo:

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