A request for an easier way to pass a storage class to a template

Andrej Mitrovic andrej.mitrovich at gmail.com
Mon Oct 24 20:02:34 PDT 2011


struct Signal(Types...)
{
    alias void delegate(Types) DG;

    void add(DG dg)
    {
        dgs ~= dg;
    }

    DG[] dgs;
}

struct Workaround(alias DG)
{
    void add(typeof(DG) dg)
    {
        dgs ~= dg;
    }

    typeof(DG)[] dgs;
}

void main()
{
    Signal!(int) foo;      // ok
    foo.add( (int){} );

    Signal!(ref int) bar;   // NG
    bar.add( (ref int){} );

    Workaround!((ref int){}) doo;  // workaround
    doo.add( (ref int){} );
}

Currently you can't create signals with ref parameters (std.signals),
nor the new one by Johannes Pfau (you can but it's problematic due to
nonref<>ref handler bugs, described in another d.learn thread).

I did find a workaround, but it's not very pretty. You have to create
delegates just to pass a storage class around.

Is there anything planned or been talked about w.r.t. passing storage
classes along with type parameters?

I know about ParameterStorageClassTuple and friends, but that's hardly
useful in this case. You would still need to define a function, which
means even more visual bloat! :)


More information about the Digitalmars-d mailing list