Steven Schveighoffer wrote:
On Tue, 01 Dec 2009 13:50:38 -0500, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:
Steven Schveighoffer wrote:
On Sat, 28 Nov 2009 18:36:07 -0500, Walter Bright
<newshou...@digitalmars.com> wrote:
And here it is (called opDispatch, Michel Fortin's suggestion):
http://www.dsource.org/projects/dmd/changeset?new=trunk%2f...@268&old=trunk%2f...@267
I have a few questions:
1. How should the compiler restrict opDispatch's string argument?
i.e. if I implement opDispatch, I'm normally expecting the string to
be a symbol, but one can directly call opDispatch with any string (I
can see clever usages which compile but for instance circumvent const
or something), forcing me to always constrain the string argument,
i.e. always have isValidSymbol(s) in my constraints. Should the
compiler restrict the string to always being a valid symbol name (or
operator, see question 2)?
Where in doubt, acquire more power :o). I'd say no checks; let user
code do that or deal with those cases.
It is unlikely that anything other than symbols are expected for
opDispatch, I can't think of an example that would not want to put the
isValidSymbol constraint on the method.
An example of abuse:
struct caseInsensitiveWrapper(T)
{
T _t;
auto opDispatch(string fname, A...) (A args)
{
mixin("return _t." ~ toLower(fname) ~ "(args);");
}
}
class C { int x; void foo(); }
caseInsensitiveWrapper!(C) ciw;
ciw._t = new C;
ciw.opDispatch!("x = 5, delete _t, _t.foo")();
I don't know if this is anything to worry about, but my preference as an
author for caseInsensitiveWrapper is that this last line should never
compile without any special requirements from me.
2. Can we cover templated operators with opDispatch? I can envision
something like this:
opDispatch(string s)(int rhs) if(s == "+") {...}
How do you mean that?
Isn't opBinary almost identical to opDispatch? The only difference I
see is that opBinary works with operators as the 'symbol' and dispatch
works with valid symbols. Is it important to distinguish between
operators and custom dispatch?
-Steve
opBinary is a binary operator, opDispatch can be anything. I think they
should be kept separate.