On Saturday, 14 July 2018 at 11:37:20 UTC, Timoses wrote:
On Saturday, 14 July 2018 at 11:08:21

How about this?


import std.variant: Variant;
import std.traits : isCallable;

class Foo
{
    void bar(string s, long l)
    {
        import std.stdio : writeln;
        writeln(s); writeln(l);
    }
}

void call(T)(T fun, in Variant[] args)
         if (isCallable!fun)
{
    import std.traits : Parameters;
    alias Params = Parameters!fun;

    Params params;
    static foreach(i, param; params)
    {
        if (auto p = args[i].peek!(Params[i]))
        {
                param = *p;
        }
// perhaps create a warning if peeking was unsuccessful...
    }
    fun(params);
}

unittest
{
    Foo foo = new Foo();
    Variant[] args = [Variant("Hello"), Variant(42L)];
    call(&foo.bar, args);
}

Thank you so much!

Kind regards
Andre

Reply via email to