On Sun, Dec 18, 2011 at 14:13, Heromyth <bitwo...@qq.com> wrote:
> I have a delegate as a parameter in a function which is a template function.
> And I want to use alias for the delegate parameter.
> Is there a better way for this?

I suppose you do *not*want the commented line?

You can extract a template parameter with an is() expression. But the
extracted type is only accessible inside a static if.
Solution: expose it through an alias:

template AsynchronousActionParam(T)
{
    static if (is(T t == void delegate(U), U))
        alias U AsynchronousActionParam ;
    else
        static assert(false, "Bad AsynchronousActionParam call: " ~  
T.stringof);
}

class TestC
{
    int b = 3;

    void test(F)(F func ) if (is(AsynchronousActionParam!F))
    {
        static if (is(AsynchronousActionParam!F == string))
            func("It's me");
        else
            writeln("test called with void delegate(" ~
AsynchronousActionParam!F ~ ").");
    }

    this(int x)
    {
        b = x;
    }
}

void main()
{
    auto c = new TestC(3);

    void foo(string s) { writeln("foo: ", s);}

    c.test(&foo);
}

Reply via email to