On 07/05/2014 10:33 PM, Uranuz wrote:
I have another question about testing if given symbol is instance of the
given template and geting it's template arguments.

Applying Rene Zwanenburg's message... It is not complete because integral template parameters don't work yet.

import std.typetuple;

template instanceArgsOf(alias S, T)
{
    import std.traits : isInstanceOf;

    static if (isInstanceOf!(S, T))
    {
        static if (is(T == S!Args, Args...)) {
            alias instanceArgsOf = Args;

        } else {
            alias instanceArgsOf = void;
        }

    } else {
        alias instanceArgsOf = void;
    }
}

unittest
{
    // Adapting the unittests of std.traits.isInstanceOf

    static struct Foo(T...) { }
    static struct Bar(T...) { }
    static struct Doo(T) { }
    static struct ABC(int x) { }
    static assert(is (instanceArgsOf!(Foo, Foo!(int, double)) ==
                      TypeTuple!(int, double)));
    static assert(is (instanceArgsOf!(Foo, Bar!int) == void));
    static assert(is (instanceArgsOf!(Foo, int) == void));
    static assert(is (instanceArgsOf!(Doo, Doo!int) == TypeTuple!(int)));

    /*
     * The following needs more work because what comes back is something
     * called a 'tuple(1)' (Yes, in lowercase.)
     *
     * static assert(is (instanceArgsOf!(ABC, ABC!1) == TypeTuple!(1)));
     */

    static assert(!__traits(compiles, instanceArgsOf!(Foo, Foo)));
}

void main()
{}

Ali

Reply via email to