
What is the correct way to override the << op for a unit so that it say prints "Pa" instead of "m^-1 kg s^-2"?
I tried this and no worky:
#include <boost/units/io.hpp>
namespace boost { namespace units {
template<> inline std::string name_string< boost::units::pressure_dimension, boost::units::si::system >(const boost::units::si::pressure&) { return "Pa"; }
}} // boost::units
"name_string" and "symbol_string" aren't templated - they are overloaded functions, so the template is not correct. Also, you defined "name_string", which is for fully-formatted unit output (e.g. "pascal" vs. "Pa"), so you are overloading the wrong function here. The easy way is to include the SI IO header : #include <boost/units/io.hpp> #include <boost/units/quantity.hpp> #include <boost/units/systems/si.hpp> #include <boost/units/systems/si/io.hpp> #include <iostream> using namespace boost::units; int main(void) { std::cout << name_format << 1.0*si::pascal << std::endl << symbol_format << 1.0*si::pascal << std::endl; } giving 1 pascal 1 Pa The default output formatter is symbol format. Your code, with fixes of the bugs above, works as well : #include <boost/units/io.hpp> #include <boost/units/systems/si.hpp> namespace boost { namespace units { inline std::string symbol_string(const si::pressure&) { return "Pa"; } } } // boost::units #include <iostream> using namespace boost::units; int main(void) { std::cout << 1.0*si::pascal << std::endl; } HTH, Matthias