2011-10-03 5 views
9

Attualmente sto usando boost :: units per rappresentare la coppia in unità si, tuttavia mi viene data la coppia in piedi libbra. Sto tentando in tal modo di creare un'unità di coppia di torsione e una conversione per supportare questo. Il mio tentativo pigro era quello di definire semplicemente:Come aggiungere la propria unità base e le conversioni usando boost :: units

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

E poi fare:

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

Ma questo si sente insoddisfacente. Il mio secondo tentativo è stato quello di tentare di definire una nuova unità base chiamata pound_foot (vedi sotto). Ma quando provo ad usarlo in un modo simile a quello sopra (con un cast per l'unità si) ottengo una pagina piena di errori. Qualche suggerimento sull'approccio corretto?

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

risposta

6

piede Pound non è in realtà un'unità di base, quindi meglio andare con il modo pulito e definirlo in termini di unità di base, che sono i piedi e chili:

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

Questo programma calcola il fattore di conversione dai valori noti di piede e libbra, l'uscita è 1.35582 m^2 kg s^-2 rad^-1. Per favore, permettimi comunque di sghignazzare per l'inferiorità del sistema imperiale.

+0

Funziona come un incantesimo - grazie. –