T : T*

Jakob Ovrum jakobovrum at gmail.com
Fri Apr 13 12:04:07 PDT 2012


On Friday, 13 April 2012 at 18:47:55 UTC, Jonathan M Davis wrote:
> I'd just like to verify that my understanding of T : T* in this 
> template is
> correct:
>
> struct S(T : T*)
> {
>  T t;
> }
>
> It's my understanding that it's requiring that the template 
> argument be
> implicitly convertible to a pointer to that type. However, as 
> this
> stackoverflow question shows:
>
> http://stackoverflow.com/questions/10145779/why-this-template-parameters-
> constraint-doesnt-work
>
> it appears that the compiler is instead taking this to mean 
> that the pointer
> part of the type should be stripped from the template 
> argument's type. Given
> some of the bizarre stuff that happens with is expressions and 
> the like, it's
> not out of the question that I'm just misunderstanding what the 
> compiler is
> supposed to do with T : T* in this case (though I don't think 
> so), so I'd like
> to verify it.
>
> - Jonathan M Davis

First, the argument type must match the form T*. The T can be any 
type; there is only one constraint here, the pointer head. So 
obviously, the argument type must be a pointer to anything to 
match T*, e.g. void*, shared(int)**, immutable(int)* etc. If it 
doesn't match, the template is dropped from the overload set.

If it does match, the newly created symbol T refers to the role 
of T in the parameter specialization. For arguments void*, 
shared(int)** and immutable(int)*, that would be void, 
shared(int)* and immutable(int) respectively.

Most forms of the `is` primary expression (IsExpression) are 
dedicated to allowing the same type inspection abilities (and 
some more) outside of template parameter lists, hence reading the 
documentation of IsExpression is a good idea [1]. In particular, 
it reveals that when the type specialization is dependent on the 
symbol identifier (e.g. there's a T in the T specialization) the 
resulting symbol refers to the deduced type; otherwise it is an 
alias of the type specialization, which explains the two uses you 
mention.

     [1] http://dlang.org/expression.html#IsExpression


More information about the Digitalmars-d-learn mailing list