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?

Well something like this.

struct MyString
{
   string value;
   alias value this;

   auto opBinary(string op)(string rhs) if( op == "^" )
   {
      string result;
      foreach(i; 0 .. min(value.length, rhs.length))
          result ~= value[i] ^ rhs[i];
      return MyString(result);
   }
}

auto mstr(string s)
{
   return MyString(s);
}

auto s   = "Hello";
auto s2  = "World";


auto res = s.mstr ^ s2;
or
string res = s.mstr ^ s2; //If you want the result to be a string.

While this works it's not that much better then the simple:

auto s = "Hello";
auto s2 = "World";
auto res = s.xor(s2);

It seems I can't even inherit from string.

In D a string is not a class its just an immutable array (slice) of char.
alias string = immutable(char[]);

Reply via email to