
Hi, I have implemented the emulation of ratio arithmetic template aliases using inheritance. While this cover most of the cases, as e.g. boost::ratio_add< boost::ratio<1,2>, boost::ratio<1,3> > could be seen as a ratio<5,6>, as in boost::intmax_t func(boost::ratio<5,6> s) { return s.num; } boost::intmax_t test_conversion() { return func(boost::ratio_add<boost::ratio<1,2>, boost::ratio<1,3> >() ); } there are some cases where the matching doesn't works. Next follows an example template <typename T, typename R> struct S { T val; }; boost::intmax_t func(S<int, boost::ratio<5,6> > const& s) { return s.val*3; } boost::intmax_t test() { return func( S<int, boost::ratio_add< boost::ratio<1,2>, boost::ratio<1,3> > // ::type // (1)
() ); }
with the following error: ratio_arithmetic\ratio_add_3.fail.cpp:27: error: invalid initialization of reference of type 'const S<int, boost::ratio<5ll, 6ll> >&' from expression of type 'S<int, boost::ratio_add<boost::ratio<1ll, 2ll>, boost::ratio<1ll, 3ll> > >' In order to make this work we need yet to add the ::type in line (1). I hope this will not be critical limitation :) Respect to the constructors and assignement extensions, here is an example that works with the extension (uncomment the #define) and fails otherwise //#define BOOST_RATIO_EXTENSIONS #include <boost/ratio.hpp> boost::intmax_t func(boost::ratio<5,6> const& s) { return s.num; } boost::intmax_t test() { return func(boost::ratio<10,12>()); } with the error: ratio_ratio\ratio4.fail.cpp:14: error: invalid initialization of reference of type 'const boost::ratio<5ll, 6ll>&' from expression of type 'boost::ratio<10ll, 12ll>' The alternative is to add ::type to force normalized ratios boost::intmax_t func(boost::ratio<5,6> const& s) { return s.num; } boost::intmax_t test() { return func(boost::ratio<10,12>::type()); } Best, _____________________ Vicente Juan Botet Escribá http://viboes.blogspot.com/