defining "in" What is the proper way in D2?

Timon Gehr timon.gehr at gmx.ch
Sun Sep 11 15:11:11 PDT 2011


On 09/11/2011 11:12 PM, Jonathan M Davis wrote:
> On Sunday, September 11, 2011 14:00:55 Charles Hixson wrote:
>> On 09/11/2011 01:25 PM, Vladimir Panteleev wrote:
>>> On Sun, 11 Sep 2011 23:02:37 +0300, Charles Hixson
>>>
>>> <charleshixsn at earthlink.net>  wrote:
>>>> I can't figure it out from
>>>> http://www.digitalmars.com/d/2.0/operatoroverloading.html#Binary
>>>
>>> // I assume your data structure looks like this
>>> class Node(Key, Data)
>>> {
>>> Key k;
>>> Node!(Key, Data) left, right;
>>> int level;
>>> // ...
>>>
>>> void opBinary!("in")(Key k)
>>> {
>>> if (level == 0) return false;
>>> if (k<  key) return k in left;
>>> if (key<  k) return k in right;
>>> return true;
>>> }
>>> }
>>
>> VOID??  I'm going to presume that this should have been bool.
>> Otherwise, thanks.  That was they syntax I couldn't figure out from the
>> docs.
>>
>> And, yeah.  That's what it looks like.  My find code was wrong, because
>> it should have referenced the node, so what I need to do is move the cod
>> into the node class.  But it was the syntax of defining the opBinary
>> specialization that was hanging me up.  (For some reason I have a hard
>> time wrapping my mind around template code.)
>
> The "in" operator normally returns a pointer to the value that you're trying
> to find (and returns null if it's not there). Making it return bool may work,
> but it's going to be a problem for generic code.

-1

I think the fact that "in" for AAs returns a pointer is a mistake and 
ugly in the first place and any generic code that relies on any 
container to return a raw internal pointer is flawed by itself imho.

> That's like making
> opBinary!"*" return a type different than the types being multiplied. It's just
> not how the operator is supposed to be used and could cause problems.
>

short a,b;
static assert(!is(typeof(a * b) == short));













More information about the Digitalmars-d-learn mailing list