On Thursday, 15 May 2014 at 17:08:58 UTC, monarch_dodra wrote:
On Thursday, 15 May 2014 at 12:16:52 UTC, Steven Schveighoffer wrote:
On Thu, 15 May 2014 02:05:08 -0400, monarch_dodra <[email protected]> wrote:

"move" will also delegate to "proxyMove".

This is the correct solution IMO. The principle of least surprise should dictate that a.foo should always mean the same thing. All that is required to enforce this is to make the "hook" function have a different name.

The issue(s) I have with the "hook must have a different name" is: 1. In the algorithm implementation, you must explicitly test for the hook, which, if we want to expand on, would turn all our algorithms into:
void foo(T)(T t)
{
    static if (is(typeof(t.fooHook())))
        return t.fooHook();
    else
        ...
}
2. The "overriden" hook is only useful if you import the corresponding algorithm. So for example, in my 3rd pary library, if my type has "findHook", I'd *have* to import std.algorithm.find for it to be useful. Unless I want to make a direct call to "findHook", which would be ugly...

How about a middle ground? Have the function names be identical, and decorate the member version with @proxy or @hook, rather than decorating the original definition. I'd find this to be less surprising.

Reply via email to