On Wednesday, 26 June 2013 at 04:16:30 UTC, Ali Çehreli wrote:
On 06/25/2013 09:05 PM, Jonathan M Davis wrote:

> On Wednesday, June 26, 2013 05:35:03 cal wrote:
>> On Wednesday, 26 June 2013 at 02:50:51 UTC, Eric wrote:
>>> Is there a way to overload the ! operator?  I can't seem to
get
>>> it to work with the standard unaryOp method.  I need this
>>> because
>>> I am making a wrapper for a C++ API that has ! overloaded.
>>>
>>> -Eric
>>
>> According to http://dlang.org/operatoroverloading.html#Cast,
the
>> following are rewritten:
>>
>> if (e) => if (e.opCast!(bool))
>> if (!e) => if (!e.opCast!(bool))
>>
>> So perhaps you need to override opCast!(bool).
>
> 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).

Works for ternary as well.

The other option is 'alias this' but it is a little dangerous because bool is an arithmetic type. So, opCast would be better.

import std.stdio;

struct S
{
    int i;

    bool truth() const
    {
        return i == 42;
    }

    alias truth this;
}

void foo(bool b)
{
    writeln(b);
}

void main()
{
    auto s = S(42);

    if (s){
    }

    while (s) {
        break;
    }

    int i = s ? 4 : 5;

    foo(s);

    // What does it mean?
    writeln(s + 2);
    writeln(!s - 7);
}

> So, if you need to be able to do !obj in the general case,
that's not going to
> work

It surprisingly works both with opCast and 'alias this'.

Ali


Thanks for all the insignt. But I think I'm just going to fudge this one
with a "bang()" method...

Incidently, for this project I figured out an interesting use of alias. The C++ classes I am wrapping have a lot of virtual methods with all primitive arguments. So I create an D-interface for them, and wrap the rest with C methods. The wrapper class then makes methods that call the C methods, and then aliases the interface reference to "this" so that the wrapper class instance points to both the C++ native methods as well as the C-wrapped methods.

-Eric








Reply via email to