yank unary '+'?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Dec 6 20:43:38 PST 2009


bearophile wrote:
> Walter Bright:
> 
>> Think of it like the "bool" operator overload. bool gives a direct
>> way for user defined times to be tested for if statements, etc.
>> Similarly, U+ gives a direct way for user defined types to be
>> converted to their most desired arithmetic type.
> 
> I'd like opBool in D, for example to implement multiprecision numbers
> that can be used as integers in: if (somenumber) {...

Unfortunately experience with C++ has shown that things look simpler 
than they are. If opBool is an implicit conversion to bool, then all 
sorts of weird expressions are allowed. That's why conversion to bool is 
flat out unrecommended in C++. Instead, various libraries found 
alternate ways to allow testing with if without compromising things too 
much. Loki uses conversion to an opaque pointer type. Boost uses 
conversion to a pointer to member. The standard itself uses, I think, 
conversion of iostreams to void*.

In my draft spec of operators I have the test:

a ? <expr1> : <expr2>

where a is of user-defined type, rewritten as

!!a ? <expr1> : <expr2>

and the test:

if (a) <stmt>

rewritten as

if (!!a) <stmt>

This leads to perfect correspondence with the behavior of arrays, 
pointers, class references, and integrals: you can't convert any of 
those to bool but you can test them with if or the ternary operator. 
Rewriting to !!a achieves exactly the same thing.

So user-defined types may define ! to return bool with the usual 
semantics, and the compiler nicely takes care of the rest.


Andrei



More information about the Digitalmars-d mailing list