Как добавить свой базовый блок и конверсии, используя boost :: unit - PullRequest
9 голосов
/ 04 октября 2011

В настоящее время я использую надстройки :: единицы измерения для представления крутящего момента в единицах СИ, однако мне дан крутящий момент в фунтах футов.Таким образом, я пытаюсь создать единицу крутящего момента pound_foot и преобразование для поддержки этого.Моя ленивая попытка была просто определить:

BOOST_STATIC_CONST(boost::si::torque, pound_feet = 1.3558179483314 * si::newton_meters);

А затем сделать:

boost::si::torque torque = some_value * pound_feet;

Но это кажется неудовлетворительным.Моя вторая попытка была попытка определить новую базовую единицу, названную pound_foot (см. Ниже).Но когда я пытаюсь использовать его способом, аналогичным описанному выше (с приведением к модулю si), я получаю страницу, полную ошибок.Есть предложения по правильному подходу?

namespace us {
  struct pound_foot_base_unit : base_unit<pound_foot_base_unit, torque_dimension> { };
    typedef units::make_system<
            pound_foot_base_unit>::type us_system;
    typedef unit<torque_dimension, us_system> torque;
    BOOST_UNITS_STATIC_CONSTANT(pound_foot, torque);
    BOOST_UNITS_STATIC_CONSTANT(pound_feet, torque);        
}
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(us::torque, 
                                     boost::units::si::torque, 
                                     double, 1.3558179483314);

1 Ответ

7 голосов
/ 04 октября 2011

Фут-фунт на самом деле не является базовой единицей, поэтому лучше придерживайтесь чистого пути и определите его в терминах базовых единиц, то есть футов и фунтов:

#include <boost/units/base_units/us/pound_force.hpp>
#include <boost/units/base_units/us/foot.hpp>
#include <boost/units/systems/si/torque.hpp>
#include <boost/units/quantity.hpp>
#include <boost/units/io.hpp>
#include <iostream>

namespace boost {
namespace units {
namespace us {

typedef make_system< foot_base_unit, pound_force_base_unit >::type system;
typedef unit< torque_dimension, system > torque;

BOOST_UNITS_STATIC_CONSTANT(pound_feet,torque);

}
}
}

using namespace boost::units;

int main() {
    quantity< us::torque > colonial_measurement( 1.0 * us::pound_feet );
    std::cerr << quantity< si::torque >(colonial_measurement) << std::endl;
    return 0;
}

Эта программа вычисляет коэффициент пересчета по известным значениям в футах и ​​фунтах, выходное значение равно 1.35582 м ^ 2 кг с ^ -2 рад ^ -1. Пожалуйста, позвольте мне тем не менее насмехаться над неполноценностью имперской системы.

...