On Mon, 26 Mar 2012 00:36:08 +0200, Stewart Gordon <smjg_1...@yahoo.com>
wrote:
I'm coming up against some interesting challenges while porting stuff in
my utility library to D2.
Firstly, D2 uses opBinary and opOpAssign, rather than the
operator-specific op* and op*Assign. While the latter still work, they
aren't mentioned in the current D2 docs. Which would imply that they're
on the way out; however, there's no mention at
https://github.com/D-Programming-Language/d-programming-language.org/blob/master/deprecate.dd
(See also
http://d.puremagic.com/issues/show_bug.cgi?id=7779 )
Still, it seems clear that opBinary/opOpAssign is the D2 way of doing
it. But it has the drawback that, because it's a template, it isn't
virtual. One way about it is to keep the D1-style op functions and make
opUnary/opBinary/opOpAssign call these. But is there a better way?
The other isn't a D2-specific issue, though D2 increases the
significance of it. I have a method with the signature
Set opAnd(bool delegate(Element) dg)
I would like to enable a user of the library to pass in a delegate whose
parameter is any type to which Element is implicitly convertible. This
could be the same type as Element with the top-level constancy changed
(probably the main use case), or a type that is distinct beyond the
constancy level. Turning it into a template
Set opAnd(E)(bool delegate(E) dg)
would address this, but prevent overriding with the appropriate code for
each set implementation.
Who else has been faced with this problem? Have you found a good way of
dealing with it?
Stewart.
I believe the officially vetted answer is to have the templated calls
forward to virtual functions. Of course, if you need to do something
specific
before handing it there, you're out of luck.