[Issue 2305] New: ".sort" on array of struct can use templated "opCmp"

Jarrett Billingsley kb3ctd2 at yahoo.com
Fri Aug 22 16:46:03 PDT 2008


<d-bugmail at puremagic.com> wrote in message 
news:bug-2305-3 at http.d.puremagic.com/issues/...
> http://d.puremagic.com/issues/show_bug.cgi?id=2305
>
>           Summary: ".sort" on array of struct can use templated "opCmp"
>           Product: D
>           Version: unspecified
>          Platform: PC
>               URL: http://codepad.org/63qU9Ndr
>        OS/Version: Windows
>            Status: NEW
>          Severity: enhancement
>          Priority: P2
>         Component: DMD
>        AssignedTo: bugzilla at digitalmars.com
>        ReportedBy: tsalm at free.fr
>
>
> Actually, to sort an array of "struct", ".sort" don't use a templated 
> opCmp
> method.
>
> Here is an example that illustrate the problem (same as in the url) :
>
> import tango.io.Stdout;
>
> struct A{
> int i;
> static A opCall(int j){ A a; a.i=j; return a; }
> int opCmp(T)(T b) { static if (is(T:A)||is(T:A*)) return (i-b.i); else 
> return
> false;}
> }
>
> struct B{ // opposite ordering
> int i;
> static B opCall(int j){ B res; res.i=j; return res; }
> int opCmp(T)(T b) { static if (is(T:B)||is(T:B*)) return -(i-b.i); else 
> return
> false; }
> }
>
> void main()
> {
> int a=1,b=2;
>
> A a2=A(a),b2=A(b);
> Stdout("A")(a2.opCmp(b2))(" ")(a2<b2).newline;
> auto aa2=[a2,b2];
>
> B a3=B(a),b3=B(b);
> Stdout("B")(a3.opCmp(b3))(" ")(a3<b3).newline;
> auto aa3=[a3,b3];
>
> aa2.sort;
> aa3.sort;
>
> foreach(v;aa2) Stdout( v.i )(" ");
> Stdout.newline;
> foreach(v;aa3) Stdout( v.i )(" ");
> Stdout.newline;
> }
>
>
> -- 
>

Unsurprising.  Templated functions/methods are not functions/methods until 
they are actually instantiated.  As far as D is concerned, you have not 
overloaded opCmp.

Also, you don't return "false" from opCmp.  If something can't be compared, 
you should give an error (in this case, you can use static assert to give a 
compile-time error). 




More information about the Digitalmars-d-bugs mailing list