
AMDG Michael Fawcett <michael.fawcett <at> gmail.com> writes:
Steven, do you think it would be easy enough to provide a reciprocal helper for when conversions are that straightforward (I'm not familiar enough in this domain to know how many instances there are where the conversion is not)?
E.g. currently you have to do:
template<> struct base_unit_converter<length_tag,nautical::system_tag,SI::system_tag> { typedef double type; static type value() { return 1.852e3; } };
template<> struct base_unit_converter<length_tag,SI::system_tag,nautical::system_tag> { typedef double type; static type value() { return 1.0/1.852e3; } };
Just defining the first one should be enough, and the second one should implicitly be the reciprocal of the first (but still give the user the option to explicitly say otherwise, of course).
We just make the primary template: struct define_reverse_automatially {}; struct undefined_conversion {}; template<class Converter> struct reverse_conversion { typedef typename Converter::type type; static type value() { return(1/Converter::value()); } }; template<class Dimension, class Tag1, class Tag2> struct base_unit_converter : mpl::eval_if<is_same<Tag1, Tag2>, mpl::identity<trivial_conversion>, mpl::if_< is_base_and_derived< define_reverse_automatially, base_unit_converter<Dimension,Tag2,Tag1> >, reverse_conversion<base_unit_converter<Dimension,Tag2,Tag1> >, undefined_conversion >
::type {};
The you can write template<> struct base_unit_converter<length_tag,nautical::system_tag,SI::system_tag> : define_reverse_automatically { typedef double type; static type value() { return 1.852e3; } }; In Christ, Steven Watanabe