On Jun 7, 11 03:22, Monkol wrote:
On Mon, 06 Jun 2011 22:00:13 +0300, Steven Schveighoffer <[email protected]> wrote:Someone wrote a very compelling argument for ufcs (uniform function call syntax) for ranges, and that is, given a slew of range functions, and a slew of ranges, it is nice to use a fluent programming syntax to specify wrappers for ranges without having to extend each range type. For example: take(10,stride(2,cycle([3,2,5,3]))); vs. [3,2,5,3].cycle().stride(2).take(10); And I thought damn it would be nice if ranges could implement ufcs, but other types that you didn't want to allow infinite extendability could avoid it. That gave me an idea :) import std.stdio; struct ufcs { auto opDispatch(string name, T...)(T args) // appropriate if compiles constraint here { mixin("return ." ~ name ~ "(this, args);"); } } int foo(ufcs x, int y) { writefln("it works! %d", y); return y+1; } void main() { ufcs u; auto x = u.foo(1); assert(x == 2); } And it does indeed work (2.053)... So we can have ufcs without any changes to the compiler, and we also make it a *choice* for people who don't want to allow infinite extendability, and don't want to deal with possible compiler ambiguities. The opDispatch could even be a mixin itself (I think). What do you think? -Stevemay be you lost symbol "!" when call template opDispatch!(string name, T...)(T args)
No Steven is correct. You don't need the '!' before the template parameters.
