Parameter specialization

Ali Çehreli acehreli at yahoo.com
Fri Jul 20 23:29:05 PDT 2012


On 07/20/2012 06:47 PM, Eyyub wrote:
> Hello,
>
> I have a question about the semantic of parameter
> specialization(TemplateTypeParameterSpecialization)
> In this following code, there are 2 forms of the same function 'add' :
> <code>
>
> T add(T, U : T) (T a, U b) //doesn't work
> {
> return a + b;
> }
>
> T add(T, U) (T a, U b) if(is(U : T)) //works
> {
> return a + b;
> }
>
>
> void main()
> {
> assert(add(2, cast(short)2) == 4);
> }
> </code>
> So, I infer that, in this case, TemplateTypeParameterSpecialization and
> TypeSpecialization(of IsExpression) aren't semantically equal ? What are
> differences between this 2 forms ?
>
> Eyyub,
>
> (I hope that I have an english a bit compréhensible)

The confusion is due to the two different meanings of the ':' operator.

1) In the template parameter list, ':' specializes U. "U : T" means: 
"this is a specialization where U is T".

   http://dlang.org/template.html

(Search for the "Specialization" section.)

When you use the template, T is int and U is short; so that 
specialization is not considered.

2) In an is expression, ':' means "implicitly convertible to".

   http://dlang.org/expression.html#IsExpression

So "is(U : T)" matches because "short is implicitly convertible to int."

Ali

-- 
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html


More information about the Digitalmars-d-learn mailing list