nice! But for some reason I believe this would work for argument
functions

double f(quantity<si::length>  v){ return 1.;}
...
 quantity<cgs::lengh>  A = 4.*cgs::centimeter
 f(A);   // doesn't work! not matching function

why is this? isn't the argument of the call a sort of construction
argument for the function argument, or is more like a plain
assignment. Is there a way to force the automatic conversion of the
function call.

Or I am forced to use this other long call?

 f(quantity<si::length>(A));

Yes.  The constructor is explicit.

Or you can write it as a template function that takes any argument that is a quantity of length :

#include <iostream>

#include <boost/units/io.hpp>
#include <boost/units/systems/cgs.hpp>
#include <boost/units/systems/si.hpp>

using namespace boost::units;

template<class System,class Y>
Y f(quantity<unit<length_dimension,System>,Y> v)
const Y w = quantity<si::length,Y>(v).value(); 


std::cout << v << "\t" << w << std::endl;


return w;
}

int main(void)
{
f(quantity<cgs::length,double>(17.0*cgs::centimeters));


return 0;
}

Matthias