Overload of ! operator
cal
callumenator at gmail.com
Tue Jun 25 22:14:36 PDT 2013
On Wednesday, 26 June 2013 at 05:08:07 UTC, Jonathan M Davis
wrote:
> On Wednesday, June 26, 2013 06:59:14 cal wrote:
>> On Wednesday, 26 June 2013 at 04:06:05 UTC, Jonathan M Davis
>>
>> wrote:
>> > Yeah, that should work for the conditions in if, while, and
>> > for
>> > loops but
>> > won't work for anything else (_maybe_ ternary operators, but
>> > I'm not sure).
>> > So, if you need to be able to do !obj in the general case,
>> > that's not going to
>> > work
>>
>> ...
>>
>> import std.stdio;
>>
>> struct S {
>> int x;
>> bool opCast(T)() if (is(T == bool)) {
>> return x == 0;
>> }
>> }
>>
>> void main() {
>> auto s = S(1);
>> auto b = !s;
>> writeln(b); // true
>> }
>>
>> Is this not supposed to work?
>
> No, it's not. That would require an implicit cast (which
> requires using alias
> this). opCast gives you an explicit cast only. Where that
> becomes confusing is
> the fact that the compiler inserts explicitly casts to bool in
> conditions for
> if statements, loops, and the ternary operator. e.g.
>
> if(foo) {...}
>
> becomes
>
> if(cast(bool)foo) {...}
>
> So, if you've overloaded opCast to bool, then it'll get used in
> the conditions
> for if statements, loops, and the ternary operator. But no
> explicit cast is
> added just for putting ! in front of a variable. It works with
> something like
>
> if(!foo) {...}
>
> simply because that becomes
>
> if(!cast(bool)foo) {...}
>
> But nothing special is done for !, and !a will not call opCast.
>
> - Jonathan M Davis
But that code I posted does work, and gives the output shown. Am
I misunderstanding?
More information about the Digitalmars-d-learn
mailing list