logical operands on strings

John Colvin john.loughran.colvin at gmail.com
Sun Jan 12 11:14:34 PST 2014


On Sunday, 12 January 2014 at 18:37:40 UTC, Erik van Velzen wrote:
> On Sunday, 12 January 2014 at 18:28:38 UTC, Meta wrote:
>>
>> It looks like your opBinary on strings is an attempt at 
>> globally overriding the XOR operator. I'm almost 100% sure 
>> this won't work in D. All operator overloads have to be part 
>> of a class or struct.
>
> How would I do that without rewriting an entire string class? 
> It seems I can't even inherit from string.
>
> Forgive me for making the comparison, but I believe in C++ i 
> can simply implement this function and be done with it:
>
>     string operator^(string lhs, string rhs);

global operator overloads aren't allowed in D. For your 
particular problem I would construct a wrapper around string 
using psuedo-inheritance via 'alias this':

struct MyString
{
     string nativeStr;
     alias nativeStr this;

     auto opBinary(string op)(string rhs)
         if(op == "^")
     {
         return xor(nativeStr, rhs);
     }

     void opOpBinary(string op)(string rhs)
         if(op == "^")
     {
         nativeStr = xor(nativeStr, rhs);
     }
}

All normal string operations on a MyString will be applied to 
nativeStr thanks to alias this, except the ^ and ^= whch are 
intercepted by the opBinary and opOpBinary methods in MyString.

The ^= could be more efficient by working in-place.
Also, you should pre-allocate the return string in xor as it's a 
lot quicker than doing repeated append operations.


More information about the Digitalmars-d-learn mailing list