Make objects.opEquals a template?

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Mon Jul 13 02:23:34 PDT 2015


On Monday, 13 July 2015 at 06:49:10 UTC, Yuxuan Shui wrote:
> The main reason here is to use '==' in @safe code:
>
> class A {
> 	override @safe bool opEquals(Object o) {
> 		return cast(A)o !is null;
> 	}
> }
> @safe void main() {
> 	A a = new A;
> 	A b = new A;
> 	a == b;
> }
>
> This doesn't compile in current D, because objects.opEquals 
> takes two Object, and Object.opEquals is not @safe.
>
> Why can't we have a template objects.opEquals?
>
> auto opEquals(T, S)(T a, S b) { ... }

https://issues.dlang.org/show_bug.cgi?id=9769

In theory, the plan is to remove opEquals, opCmp, toString, and 
toHash from Object so that they no longer force a particular set 
of attributes on everyone. The free function, opEquals would be 
templated as part of that (though the opEquals on a class could 
not be templated and be a virtual function). Then folks would 
define those functions on their derived classes without whatever 
attributes they wanted.

Unfortunately, not a lot of work has been done towards removing 
them from Object. I worked on templatizing the free function, 
opEquals, previously, but compiler bugs prevented those changes 
from being merged in. I need to try it again and see if it can be 
made to work now. The AAs need to be redesigned for this to work 
as well, and Martin Nowak has been doing work for that, but 
that's not done yet AFAIK, and none of the other work which would 
be required to remove those functions from Object has been done 
(and compiler changes would likely be required in order to do it 
in a way that didn't immediately break code).

So, ultimately, the free function, opEquals should end up being a 
template function, and Object itself will no longer support 
opEquals, but it's unlikely that opEquals on classes will end up 
being templates, because then they wouldn't be virtual. But then, 
they'd have whatever attributes a programmer but on their base 
class rather than forcing a particular set of them like we do now.

- Jonathan M Davis


More information about the Digitalmars-d mailing list