In my opinion, there is not much gain in using literals for Boost.Units because a stronger syntax can be achieved with existing features.
In simple cases, it seems that literals are the way to go, but soon you will see that it is not very powerful. For example, you still need to define literals for combined units, for example, how do you express 1 m / s (one meter per second)?
Currently
auto v = 1*si::meter/si::second; // yes, it is long
but with literals?
// fake code using namespace boost::units::literals; auto v = 1._m_over_s; // or 1._m/si::second; or 1._m/1_s // even worst
A better solution can be achieved with existing features. And this is what I do:
namespace boost{namespace units{namespace si{
You can do the same in the same way: auto a = 1.*m/pow<2>(s); or expand the abbreviations more if you want (for example, static const area m2 = pow<2>(si::meter); )
What else is needed for this?
Perhaps a combined solution may be a way
auto v = 1._m/s; // _m is literal, /s is from si::abbreviation combined with operator/
but there will be so much redundant code, and the gain is minimal (replace * with _ after the number.)
One of the drawbacks of my solution is that it swaps the namespace with common names of one letter. But I don’t see a way around this, except to add an underscore (to the beginning or end of the abbreviation), as in 1.*m_/s_ , but at least I can build real unit expressions.