http://d.puremagic.com/issues/show_bug.cgi?id=7265
--- Comment #9 from SHOO <[email protected]> 2012-01-17 06:37:31 PST --- By the way, the reason why I set this Issue with regression is that I cause a difficult problem with the following cases: ------ import std.stdio, std.functional; // Library code struct Control { alias void delegate(Control o) Handler; Handler[] _handlers; void addHandler(H)(H hnd) { _handlers ~= cast(Handler)hnd; } void addHandler2(H)(H hnd) if (is(H == delegate)) { _handlers ~= cast(Handler)hnd; } // Workaround. It is settled if can handle either by toDelegate. void addHandler3(H)(H hnd) { _handlers ~= cast(Handler)toDelegate(hnd); } void call() { foreach (h; _handlers) { h(this); } } } // User code void main() { int i; auto c = new Control; // OK. This literal is inferred delegate. c.addHandler( (Object o){ writeln(i); } ); // Error. This literal is inferred function pointer. // c.addHandler( (Object o){ writeln("test"); } ); // Error. This literal is inferred function pointer, too. // The constraint-if does not influence the type inference. // c.addHandler2( (Object o){ writeln("test2"); } ); // Workaround. c.addHandler3( (Object o){ writeln("test3"); } ); c.call(); } ------ When a library code has a definition such as Control, many breaking changes befall user codes. Actually, this way is used by DFL. One of simple workaround is to use toDelegate with library codes. I think that another solution is to let implicit conversion perform a role as toDelegate. I remember it has entered ML agenda several times. But I've forgotten the conclusion. Is there a person knowing the details? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
