opCmp'ın eksi, sıfır, veya artı bir değer döndürmesi gerekir. Bunu tamsayı üyeler ile sağlamanın en kolay yolu da o üyelerin değerlerini basit bir çıkartma işleminde kullanmaktır. Bu yöntemden ben de şu bölümde yararlanmıştım:
http://ddili.org/ders/d/islec_yukleme.html
Soldaki nesnenin üyesinden sağdaki nesnenin üyesi çıkartılır:
int opCmp(const ref GününSaati sağdaki) const
{
return (saat == sağdaki.saat
? dakika - sağdaki.dakika
: saat - sağdaki.saat);
}
Bunun bazen yanlış sonuç doğurabileceğini aşağıdaki forum konusundan öğrendim:
Tamsayı taşması nedeniyle int.min değerli nesne int.max değerli nesneden daha büyük çıkıyor.
O yüzden en iyisi eğer küçük ise vs. biçiminde açıkça kodlamakmış. Forum konusundaki kodda küçük olma durumunu özel olarak kodlarsak aşağıdaki işlev doğru işler:
int opCmp(S sağdaki)
{
if (i < sağdaki.i) {
return -1;
}
return i - sağdaki.i;
}
Ali
Not: Eğer yukarıdaki saat değerlerinde olduğu gibi, üyelerin değerlerini hiçbir zaman int.min veya int.max gibi uç değerler olmadıkları garantilenirse çıkartma işlemi yine de kullanılabilir.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]