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