[Issue 8441] mixin containing template functions causes compiler errors

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Jan 18 10:39:35 PST 2013


http://d.puremagic.com/issues/show_bug.cgi?id=8441



--- Comment #7 from jfanatiker at gmx.at 2013-01-18 10:39:34 PST ---
Ha! Sorry :-) I completely forgot about the example of Ellery Newcomer (And I
wondered already how you made up such an elaborate solution, from such a simple
problem ;-) ).
The code I am concerned with is:
https://github.com/eskimor/phobos/blob/new_signal/std/signals.d

The template mixin code in particular:
mixin template Signal(Args...)
{
    private final void emit( Args args )
    {
        full.emit(args);
    }
    final void connect(string method, ClassType)(ClassType obj) if(is(ClassType
== class) && __traits(compiles, {void delegate(Args)
dg=mixin("&obj."~method);}))
    {
        full.connect!method(obj);
    }
    final void connect(ClassType)(ClassType obj, void delegate(ClassType obj,
Args) dg) if(is(ClassType == class))
    {
        full.connect(obj, dg);
    }
    final void strongConnect(void delegate(Args) dg)
    {
        full.strongConnect(dg);
    }
    final void disconnect(string method, ClassType)(ClassType obj)
if(is(ClassType == class) && __traits(compiles, {void delegate(Args)
dg=mixin("&obj."~method);}))
    {
        full.disconnect!method(obj);
    }
    final void disconnect(ClassType)(ClassType obj, void delegate(ClassType,
T1) dg) if(is(ClassType == class))
    {
        full.disconnect(obj, dg);
    }
    final void disconnect(ClassType)(ClassType obj) if(is(ClassType == class))
    {
        full.disconnect(obj);
    }
    final void strongDisconnect(void delegate(Args) dg)
    {
        full.strongDisconnect(dg);
    }
    final ref RestrictedSignal!(Args) restricted() @property
    {
        return full.restricted;
    }
    private FullSignal!(Args) full;
}

Use case:

class Button {
 mixin Signal!() clicked;
 void click() {
   clicked.emit();
 }
}
import std.stdio;
void main() {
Button b=new Button;
b.clicked.strongConnect(() {writeln("I was clicked!");});
b.click();
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list