April 16, 2020
Just out of curiosity, is there a mixin template or something like that in Phobos for implementing a default .opEquals that does member-wise comparison of a class object? Something like this:

	mixin template DefaultOpEquals(T) {
		bool opEquals(Object o) {
			auto t = cast(T) o;
			if (t is null) return false;
			foreach (field; __traits(getAllMembers, T)) {
				if (this.field != t.field) return false;
			}
			return true;
		}
	}

It's annoying to have to write an .opEquals method for every class that basically just does the same thing.


T

-- 
Verbing weirds language. -- Calvin (& Hobbes)
April 16, 2020
On 4/16/20 1:21 PM, H. S. Teoh wrote:
> Just out of curiosity, is there a mixin template or something like that
> in Phobos for implementing a default .opEquals that does member-wise
> comparison of a class object? Something like this:
> 
> 	mixin template DefaultOpEquals(T) {
> 		bool opEquals(Object o) {
> 			auto t = cast(T) o;
> 			if (t is null) return false;
> 			foreach (field; __traits(getAllMembers, T)) {
> 				if (this.field != t.field) return false;
> 			}
> 			return true;
> 		}
> 	}
> 
> It's annoying to have to write an .opEquals method for every class that
> basically just does the same thing.
> 

This used to work:

this.tupleof == t.tupleof;

But you may have to use std.traits or something to get in all the base class fields.

-Steve