Thread overview
template parameters
Sep 25, 2009
Ellery Newcomer
Sep 25, 2009
BCS
Sep 25, 2009
Ellery Newcomer
Sep 25, 2009
Christopher Wright
Sep 25, 2009
Ellery Newcomer
Sep 26, 2009
BCS
September 25, 2009
Hello.

Today I was looking at the grammar for template value parameters and realized I didn't know what the conditional expression is for in

TemplateValueParameter => BasicType Declarator : ConditionalExpression

So what does it do?

(I assume = ConditionalExpression is the default value for the parameter)
September 25, 2009
Hello Ellery,

> Hello.
> 
> Today I was looking at the grammar for template value parameters and
> realized I didn't know what the conditional expression is for in
> 
> TemplateValueParameter => BasicType Declarator : ConditionalExpression
> 
> So what does it do?
> 
> (I assume = ConditionalExpression is the default value for the
> parameter)
> 

That is correct. it would seem that expression should be used, but that includes an assignment expression so the next things down is used.

http://www.digitalmars.com/d/1.0/expression.html#AssignExpression


September 25, 2009
BCS wrote:
> Hello Ellery,
> 
>> Hello.
>>
>> Today I was looking at the grammar for template value parameters and realized I didn't know what the conditional expression is for in
>>
>> TemplateValueParameter => BasicType Declarator : ConditionalExpression
>>
>> So what does it do?
>>
>> (I assume = ConditionalExpression is the default value for the
>> parameter)
>>
> 
> That is correct. it would seem that expression should be used, but that includes an assignment expression so the next things down is used.
> 
> http://www.digitalmars.com/d/1.0/expression.html#AssignExpression
> 
> 

Okay, let me rephrase that:

When you have a <something> preceded by a colon in a template value parameter, what are its semantics? Is it the same as a default parameter value? Is it some sort of constraining expression? Is it a vestige?
September 25, 2009
Ellery Newcomer wrote:
> Okay, let me rephrase that:
> 
> When you have a <something> preceded by a colon in a template value
> parameter, what are its semantics? Is it the same as a default parameter
> value? Is it some sort of constraining expression? Is it a vestige?

void foo(T : int)(T value)
{
	// value is implicitly convertible to int
}

It can do some pattern matching:

void foo(T : V[U], V, U)(T dictionary)
{
	// I have an associative array
}

In D2, it's usually going to be easier to use constraints:

template foo(T) if (isAssociativeArray!T) {}
September 25, 2009
Christopher Wright wrote:
> Ellery Newcomer wrote:
>> Okay, let me rephrase that:
>>
>> When you have a <something> preceded by a colon in a template value parameter, what are its semantics? Is it the same as a default parameter value? Is it some sort of constraining expression? Is it a vestige?
> 
> void foo(T : int)(T value)
> {
>     // value is implicitly convertible to int
> }
> 
> It can do some pattern matching:
> 
> void foo(T : V[U], V, U)(T dictionary)
> {
>     // I have an associative array
> }
> 
> In D2, it's usually going to be easier to use constraints:
> 
> template foo(T) if (isAssociativeArray!T) {}

Great, it does something specified for a type parameter.

Now what does it do for a VALUE parameter?
September 26, 2009
On Fri, Sep 25, 2009 at 6:48 PM, Ellery Newcomer <ellery-newcomer@utulsa.edu> wrote:
> Christopher Wright wrote:
>> Ellery Newcomer wrote:
>>> Okay, let me rephrase that:
>>>
>>> When you have a <something> preceded by a colon in a template value parameter, what are its semantics? Is it the same as a default parameter value? Is it some sort of constraining expression? Is it a vestige?
>>
>> void foo(T : int)(T value)
>> {
>>     // value is implicitly convertible to int
>> }
>>
>> It can do some pattern matching:
>>
>> void foo(T : V[U], V, U)(T dictionary)
>> {
>>     // I have an associative array
>> }
>>
>> In D2, it's usually going to be easier to use constraints:
>>
>> template foo(T) if (isAssociativeArray!T) {}
>
> Great, it does something specified for a type parameter.
>
> Now what does it do for a VALUE parameter?

Specialization for particular values. It's not really that useful in the face of static if.

template fib(int n : 0) { const fib = 1; }
template fib(int n : 1) { const fib = 1; }
template fib(int n) { const fib = fib!(n - 2) + fib!(n - 1); }
September 26, 2009
Hello Ellery,

> BCS wrote:
> 
>> Hello Ellery,
>> 
>>> Hello.
>>> 
>>> Today I was looking at the grammar for template value parameters and
>>> realized I didn't know what the conditional expression is for in
>>> 
>>> TemplateValueParameter => BasicType Declarator :
>>> ConditionalExpression
>>> 
>>> So what does it do?
>>> 
>>> (I assume = ConditionalExpression is the default value for the
>>> parameter)
>>> 
>> That is correct. it would seem that expression should be used, but
>> that includes an assignment expression so the next things down is
>> used.
>> 
>> http://www.digitalmars.com/d/1.0/expression.html#AssignExpression
>> 
> Okay, let me rephrase that:
> 
> When you have a <something> preceded by a colon in a template value
> parameter, what are its semantics? Is it the same as a default
> parameter value? Is it some sort of constraining expression? Is it a
> vestige?
>

You should check me on this but I think it's explicit instantiation: "This is the special case for when given some value".