Boost logo

Boost :

Subject: Re: [boost] [1.44][Serialization] fails to compile on OSX universal
From: David Irvine (david.irvine_at_[hidden])
Date: 2010-08-21 13:04:37


On Sat, Aug 21, 2010 at 6:08 PM, Robert Ramey <ramey_at_[hidden]> wrote:
> Dave Abrahams wrote:
>> Sent from my iPhone
>>
>> On Aug 20, 2010, at 9:09 PM, Emil Dotchevski
>> <emil_at_[hidden]> wrote:
>>
>>> One option is to "fix" them anyway. Unfortunately, a lot of times
>>> this involves casting, and in general I find it ill-advised to use a
>>> cast to suppress a warning. Think about it: casts are used to tell
>>> the compiler to do something it wouldn't normally do because it is
>>> dangerous. This is true for all casts, including the ones people
>>> sprinkle around to "fix" warnings.
>>
>> True, but you can often avoid those casts by allowing (presumably
>> safer) implicit conversions to do the same work,e.g. instead of
>> static_cast<Base&>(derived), declare and initialize a named Base&.
>
> Here is what I did.
>
> I had a bunch of warnings that I could have fixed with casts.  In some
> cases I did.  But in most cases I felt I was "Hiding the problem" by
> puting in a cast.
>
> What I ended up doing in many cases was make a special type such as
>
> // a special type of integer.  This is used as an 'id" so it makes no
> // sense to apply arithmetic operation or to compare it to other integers
> // which are not this type of id
> class special_type {
>    int m_i;
> public:
>    // trap uninitialized values
>    special_type(int i) : m_i(i) {}
>    // trap erroneous comparisons
>    bool operator==(const & special_type rhs) const {
>        return m_i == rhs.m_i
>   }
>   // don't permit id to change - don't define assignment
>   // but copying is ok
>   special_type(const special_type & s) : m_i(s.m_i) ;
> };
>
> Now compile your program and all the warning are now errors.
> (plus a whole new raft of errors).  Then start doing things like
>
> replace
>    int id;
>    if(id == original_id)
>        ...
>
> with
>    special_type id(... ah think about this - this is a good thing);
>    if(id == original_id)
>        ...
>
> Now
>
> a) your warnings disappear
> b) you might have fixed a bug
> c) you have set things up to avoid future bugs
> d) at no cost in execution time
>
> This might look like a lot of work.  But it really isn't.  You
> have to think carefully about what kind of operations you
> want to actually permit and/or trap which is some work.
> But fixing the generated errors is very easy as the whole
> system almost tells you what to fix.  I can do it while participating
> in an otherwise mind numbing phone conference.  In fact
> it's a good way to do as it makes me sound less disinterested.
>
> Robert Ramey
>
>
>
> _______________________________________________
This looks like a good move and I think very efficient, although I
think perhaps for completeness you should declare the assignment
operator private, to prevent the compiler declaring if for you.


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