
scaled units are a great feature of boost.units, however it seems complicated to (explicitly) create variables in such units. This is the way I found to create a variable that stores a quantity like GigaPascals: using boost::units; typedef make_scaled_unit<si::pressure, scale<10, static_rational< 9>
::type gpa_unit; gpa_unit GPa; quantity<gpa_unit> p(1.*GPa); //or p(1.*si::giga*si::pascal);
the question is, is there a simpler way of doing this? for example, just quantity<giga<si::pressure> > p = ...; //values are converted/stored in giga pascals. I could add some "metafunction": template<class Unit> giga{ typedef make_scaled_unit<Unit, scale<10, static_rational< 9> >
::type unit; };
and use it like quantity<giga<si::pressure>::unit> p; and even specialize for femto, atto, mega, kile, etc. I this already implemented in some other way? In this way if I had implemented an electronvolt unit I could have megaelectronvolt for free quantity<mega<electronvolt_unit>::unit> energy = ...; Thank you, Alfredo

using boost::units; typedef make_scaled_unit<si::pressure, scale<10, static_rational< 9>
::type gpa_unit; gpa_unit GPa; quantity<gpa_unit> p(1.*GPa); //or p(1.*si::giga*si::pascal);
the question is, is there a simpler way of doing this? for example,
While it is not (yet) standards compliant, most current C++ compilers support this, which is about as easy as you can get : #include <boost/units/systems/si.hpp> #include <boost/units/systems/si/prefixes.hpp> using namespace boost::units; typedef typeof(si::giga*si::pascals) gigapascal_type; int main() { std::cout << 1.5*gigapascal_type() << std::endl; return 0; } Matthias

While it is not (yet) standards compliant, most current C++ compilers support this, which is about as easy as you can get :
typedef typeof(si::giga*si::pascals) gigapascal_type;
ok, that is useful, I ended up doing this namespace si{ template<class Unit> struct femto_scaled{typedef typename make_scaled_unit<Unit, scale<10, static_rational<-15> > >::type unit;}; template<class Unit> struct pico_scaled {typedef typename make_scaled_unit<Unit, scale<10, static_rational<-12> > >::type unit;}; template<class Unit> struct nano_scaled {typedef typename make_scaled_unit<Unit, scale<10, static_rational< -9> > >::type unit;}; template<class Unit> struct mega_scaled {typedef typename make_scaled_unit<Unit, scale<10, static_rational< +6> > >::type unit;}; template<class Unit> struct giga_scaled {typedef typename make_scaled_unit<Unit, scale<10, static_rational< +9> > >::type unit;}; //name "femto" instead of "femto_scaled" would clash with si::femto constant } which works pretty well, for example quantity<si::femto_scaled<si::time>::unit> one_fs(1.*si::femto*si::second); quantity<si::femto_scaled<si::time>::unit> one_s(1.*si::second); quantity<si::nano_scaled<atomic::energy>::unit> one_nanohartree(1.*si::nano*atomic::hartree); quantity<si::nano_scaled<atomic::energy>::unit> one_hartree(1.*atomic::hartree); BUT for some strange reason doesn't completely work for this unit (electronvolt) defined outside a system: quantity<si::mega_scaled<atomic::electron_volt_unit>::unit> one_Mev(1.*si::mega*atomic::eV); //works quantity<si::mega_scaled<atomic::electron_volt_unit>::unit> one_ev(1.*atomic::eV); //does not compile electron_volt is defined as namespace atomic{ struct electron_volt_base_unit : base_unit<electron_volt_base_unit, energy_dimension, 43289> { static const std::string name() { return "electronvolt";} static const std::string symbol() { return "eV"; } }; typedef electron_volt_base_unit::unit_type electron_volt_unit; static const electron_volt_unit electron_volt, eV; inline std::string symbol_string(const reduce_unit<electron_volt_unit>::type&){return "eV";} } BOOST_UNITS_DEFINE_CONVERSION_FACTOR( boost::units::atomic::electron_volt_base_unit, boost::units::atomic::energy, double, 0.03674932 ); BOOST_UNITS_DEFAULT_CONVERSION( boost::units::atomic::electron_volt_base_unit, boost::units::atomic::energy ); and the compiler error is In file included from /usr/include/boost/units/ heterogeneous_system.hpp:36, from /usr/include/boost/units/base_unit.hpp:15, from .atomic.hpp.cpp.cpp:14: /usr/include/boost/units/detail/linear_algebra.hpp: In instantiation of ‘boost::units::detail::determine_extra_equations_skip_zeros_impl<true, false>::apply<boost::units::list<boost::units::list<boost::units::static_rational<0l, 1l>, boost::units::list<boost::units::static_rational<0l, 1l>, boost::units::dimensionless_type> >, boost::units::dimensionless_type>, 1, 1, 3, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> > >’: /usr/include/boost/units/detail/linear_algebra.hpp:264: instantiated from ‘boost::units::detail::determine_extra_equations<2, false>::apply<boost::units::list<boost::units::list<boost::units::static_rational<0l, 1l>, boost::units::list<boost::units::static_rational<0l, 1l>, boost::units::dimensionless_type> >, boost::units::dimensionless_type>, 3, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> > >’ /usr/include/boost/units/detail/linear_algebra.hpp:264: instantiated from ‘boost::units::detail::determine_extra_equations<3, false>::apply<boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> >, 3, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> > >’ /usr/include/boost/units/detail/linear_algebra.hpp:538: instantiated from ‘boost::units::detail::make_square_and_invert<boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::list<boost::units::list<boost::units::static_rational<2l, 1l>, boost::units::list<boost::units::static_rational<1l, 1l>, boost::units::list<boost::units::static_rational<-0x00000000000000002l, 1l>, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> > >’ /usr/include/boost/units/detail/linear_algebra.hpp:828: instantiated from ‘boost::units::detail::normalize_units<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> > >’ /usr/include/boost/units/detail/linear_algebra.hpp:1035: instantiated from ‘boost::units::detail::calculate_base_unit_exponents_impl<false>::apply<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> >, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > > >’ /usr/include/boost/units/detail/linear_algebra.hpp:1051: instantiated from ‘boost::units::detail::calculate_base_unit_exponents<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> >, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > > >’ /usr/include/boost/units/heterogeneous_system.hpp:240: instantiated from ‘boost::units::detail::make_heterogeneous_system<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::homogeneous_system<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> > > >’ /usr/include/boost/units/unit.hpp:93: instantiated from ‘boost::units::reduce_unit<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::homogeneous_system<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> > >, void> >’ /usr/include/boost/units/detail/conversion_impl.hpp:314: instantiated from ‘boost::units::detail::conversion_impl<1>::apply<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::list<boost::units::atomic::electron_volt_base_unit, boost::units::dimensionless_type> > > >’ /usr/include/boost/units/detail/conversion_impl.hpp:445: instantiated from ‘boost::units::detail::conversion_factor_helper<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> >, void>, boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::scale_list_dim<boost::units::scale<10l, boost::units::static_rational<6l, 1l> > >, boost::units::dimensionless_type> > >, void> >’ /usr/include/boost/units/detail/conversion_impl.hpp:345: instantiated from ‘static boost::units::quantity<Unit2, T2> boost::units::conversion_helper<boost::units::quantity<Unit1, T1>, boost::units::quantity<Unit2, T2> >::convert(const boost::units::quantity<Unit1, T1>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> >, void>, T1 = double, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::scale_list_dim<boost::units::scale<10l, boost::units::static_rational<6l, 1l> > >, boost::units::dimensionless_type> > >, void>, T2 = double]’ /usr/include/boost/units/quantity.hpp:193: instantiated from ‘boost::units::quantity<Unit, Y>::quantity(const boost::units::quantity<Unit2, YY>&, typename boost::disable_if<boost::mpl::and_<typename boost::units::is_implicitly_convertible<Unit2, Unit>::type, boost::units::detail::is_non_narrowing_conversion<YY, Y>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename boost::units::detail::disable_if_is_same<Unit, Unit2>::type>::type*) [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::dimensionless_type> >, void>, YY = double, Unit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::atomic::electron_volt_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::list<boost::units::dim<boost::units::mass_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x00000000000000002l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::scale_list_dim<boost::units::scale<10l, boost::units::static_rational<6l, 1l> > >, boost::units::dimensionless_type> > >, void>, Y = double]’ .atomic.hpp.cpp.cpp:416: instantiated from here /usr/include/boost/units/detail/linear_algebra.hpp:197: error: no type named ‘item’ in ‘struct boost::units::dimensionless_type’ compilation terminated due to -Wfatal-errors.
participants (2)
-
alfC
-
Matthias Schabel