On Tuesday, 2 February 2016 at 13:20:33 UTC, Voitech wrote:
Hi, Is it possible to bound T... in template with some type ? For single Parameter declaration it can be done by T:SomeType but variadics does not seems to have that possibility ?
Cheers

Two possible solutions... If you don't need to know the number of arguments at compile time, you can use normal variadic arguments:

    void test(T)(T[] args...) {
        import std.stdio;
        writeln(T.stringof);
    }

    class A     { }
    class B : A { }
    class C : A { }

    void main()
    {
        test(1,2,3);    // int
        test(4,5,6.9);  // double
        static assert(!__traits(compiles, test(1,"xyz",9)));
        // unfortunately, this doesn't work either:
        //test(new B(), new C());
    }

The last call should work IMO, but it doesn't. I believe that's a compiler bug.

The other solution is to use `CommonType` as a template constraint:

    import std.traits;

    void test(T...)(T args)
    if(!is(CommonType!T == void))
    {
        import std.stdio;
        writeln(T.stringof);
    }

    class A     { }
    class B : A { }
    class C : A { }

    void main()
    {
        test(1,2,3);            // (int, int, int)
        test(4,5,6.9);          // (int, int, double)
        static assert(!__traits(compiles, test(1,"xyz",9)));
        test(new B(), new C()); // (B, C)
    }

As you can see, here the types don't need to match exactly, but they need to have a common base type.

Reply via email to