Why can't we derive struct's?

Rubn where at is.this
Tue Dec 25 12:50:50 UTC 2018


On Tuesday, 25 December 2018 at 11:31:17 UTC, Walter Bright wrote:
> On 12/24/2018 6:43 PM, Rubn wrote:
>> You can easily make the "+" operator do something entirely 
>> different than addition.
> If you want to make "+" non-commutative, you have to work a 
> little harder.

Not that hard at all, you just do operator overloading like 
normal.

https://run.dlang.io/is/Jg8Jff

struct Int {
     int value;
	
     this( int input ) {
         value = input;
     }

     Int opBinary(string op)(int a) const if ( op == "+" ) {
         return Int(value + a);
     }
	
     // Hell can make this return a different type and you
     // won't be even be able to do the comparison: (a + b) == (b 
+ a)
     Int opBinaryRight(string op)(int a) const if ( op == "+" ) {
         return Int(value + a + 1);
     }
}

void main() {
     import std.stdio : writeln;
	
     const Int a = 5;
     const int b = 2;

     writeln(a + b, " == ", b + a);
}

> I'm happy to see that D has successfully inculcated a culture 
> that attempting to use operator overloading for non-arithmetic 
> purposes is a code smell, rather than celebrating it as C++ 
> does. It's like:
>
> #define BEGIN {
> #define END }
> is considered a smell in C (it didn't use to be, it took a 
> while to stamp that out).

What makes you think C++ celebrates it? You just point to one 
person that thinks it's a good idea. The C++ community has tens 
of thousands more users than D, there are going to be people that 
think it is a good idea.


> We'll not be accepting such practices into the D standard 
> library, etc., and will do what we can to discourage such.
>
> So yes, if you try hard enough, you can write execrable code. 
> But you'll be on your own with it.

Sadly auto-decoding has already made it into the standard. I'm 
happy to say auto-decoding won't be making its way into the C++ 
standard :).



More information about the Digitalmars-d mailing list