On Saturday, 3 March 2018 at 00:20:14 UTC, H. S. Teoh wrote:
On Fri, Mar 02, 2018 at 11:51:08PM +0000, Jonathan Marler via Digitalmars-d wrote:
[...]

Not true:

        template counterexample(alias T) {}

        int x;
        string s;
        alias U = counterexample!x;     // OK
        alias V = counterexample!1;     // OK
        alias W = counterexample!"yup";       // OK
        alias X = counterexample!s;     // OK

        alias Z = counterexample!int;   // NG

The last one fails because a value is expected, not a type.

If you *really* want to accept both values and types, `...` comes to the rescue:

        template rescue(T...) if (T.length == 1) {}

        int x;
        string s;
        alias U = rescue!x;     // OK
        alias V = rescue!1;     // OK
        alias W = rescue!"yup";       // OK
        alias X = rescue!s;     // OK
        alias Z = rescue!int;   // OK!


T

Ah thank you...I guess I didn't realize that literals like 1 and "yup" were considered "symbols" when it comes to alias template parameters.

Reply via email to