On Sunday, 15 March 2015 at 16:53:34 UTC, Marc Schütz wrote:
On Sunday, 15 March 2015 at 16:44:14 UTC, Ali Çehreli wrote:
On 03/15/2015 08:47 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= <schue...@gmx.net>" wrote:

> Should this work?
>
>     struct V(string s) {
>     }
>
>     struct S(int U) {
>         V!"xyz" x;
>         alias x this;
>     }
>
>     void main() {
>         S!10 a;
>         static assert(is(a : V!Args, Args...));
>     }
>
> With DMD Git master, the static assert() fails. Should it? Am
I doing
> something wrong? How can I test whether something is
implicitly
> convertible to any instance of a particular template?

There is no way other than checking for compile-time duck typing (see the implementations of isInputRange and others).

One reason is that the compiler does not have the concept of "an instance of a template". Templates are for code generation and only the end-result (i.e. S!10) lives as a concept when compiling.

The code contained a small mistake, I forgot a `typeof()`:

    // static assert(is(a : V!Args, Args...));
    // should be:
    static assert(is(typeof(a) : V!Args, Args...));

This still fails, but it works when I change it to:

    static assert(is(typeof(a) : S!Args, Args...));

This means I can indeed test whether something _is_ an instance of a template. It just doesn't take the `alias this` into account. So I guess that's a bug?

Ok, now I'm pretty sure:

    class V(string s) {
    }

    class S(int U) : V!"xyz" {
    }

    void main() {
        S!10 a;
        static if(is(typeof(a) : V!Args, Args...))
            pragma(msg, Args);
    }

This works, and it even correctly infers `Args` to be `tuple("xyz")`. As `alias this` is supposed to be interchangeable with subtyping, it must be a bug.

Reply via email to