Boost logo

Boost :

From: Steven Watanabe (steven_at_[hidden])
Date: 2007-03-26 15:12:00


AMDG

Deane Yang wrote:
> Zach Laine wrote:
>
>> >
>> > Specifically,
>> >
>> > quantity<force> F(2.0*newton);
>> > quantity<length> dx(2.0*meter);
>> > F.value() = dx.value();
>> >
>> > is an abomination and should be impossible. If I really want to do
>> > this, why not make me go through the constructor, so that attention is
>> > more obviously called to what I'm doing? I could also live with using
>> > a purposely ugly cast here, but since quantity_cast() has some
>> > perfectly legitimate and safe uses, I would much prefer a different
>> > syntax that draws attention to this unsafe act, such as
>> > quantity_reinterpret_cast().
>>
> I agree completely with Zach's views on this. It's OK to have a const
> member function .value() but not a mutating one.
>> >
>> > I and a lot of other users badly need support for Imperial units. As
>> > it stands now, we will each be required to write nearly identical code
>> > to do so. This should be included in the library.
>> >
>>
> Matthias Schabel wrote:
> >
> > The problem with these non-standard units is that they don't really
> > form a
> > well-defined unit system. ...
> > We have, however, supplied a number of examples of how to
> > roll your own unit system...
> > )
>
> I agree with Zach and also want to be able to define units without
> having to "roll my own unit system".

I have contemplated something along the lines of

//this is what you need to do already
//to get feet

struct foot_tag {};

template<>
struct unit_info<length_tag, foot_tag> {
    static const char* name() { return("foot") }
    static const char* symbol() { return("ft") }
};

//converting feet to meters
template<>
struct base_unit_converter<length_tag, foot_tag, SI::system_tag> {
    typedef double type;
    static type value() { return(...) }
};
//converting meters to feet
template<>
struct base_unit_converter<length_tag, SI::system_tag, foot_tag> {
    typedef double type;
    static type value() { return(...) }
};

Now feet are defined independently of other base units and can be easily
combined
with any other set of units:

typedef make_system<
    mpl::map<
        mpl::pair<length_tag, foot_tag>,
        mpl::pair<mass_tag, SI::system_tag>,
        mpl::pair<time_tag, SI::system_tag>
>
>::type FKS_system; (feet-kilograms-seconds)

 From an implementation standpoint the only difficulty is in making
a mixed system such as inches * miles / furlongs work without
ending up with a mess.

In Christ,
Steven Watanabe


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk