Re: why would i use '!!' ?
michael wrote:
Isn't that what the
operator void * ()
trick is supposed to solve ? Then you
even don't have to define operator!()
When I wrote my SmartPtr class I tried to avoid situations
where type information could get lost, and in my understanding having
an automatic(!!) conversion to void* is the worst thing you can have.
Not the worst, otherwise IOStreams would be completely unusable, but there
are better ways. What you actually want is something that can be used in a
conditional expression but which introduces as little type ambiguity as
possible. The problem there is that both bool and void* still convert to
rather many types, in particular when considering explicit conversions. A
workaround that is sometimes used in Boost is to provide a conversion to a
pointer to a memberfunction:
struct smart_ptr
{
bool valid() const
{ return m_ptr!=0; }
typedef bool (smart_ptr::*boolean_type)(void)const;
operator boolean_type () const
{ return valid() ? &smart_ptr::valid : 0; }
bool operator!() const
{ return !valid(); }
};
/* Note:
This is using the pointer to valid() just for convenience.
It could have been any other function, too, but that one was
readily available already. */
I believe I have also seen one that goes even further in that it uses a
pointer to a memberfunction of a private nested class.
However, with respect to that, having an operator bool might open
up vulnerabilities, too
It converts to integral types, which you don't want.
Uli
--
Sator Laser GmbH
Gesch?ftsf?hrer: Thorsten F?cking, Amtsgericht Hamburg HR B62 932
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]