Thread overview
Template Arguments
Jan 09, 2007
Xinok
Jan 09, 2007
Don Clugston
Jan 09, 2007
Xinok
January 09, 2007
Is it possible to create template parameters in the D language? template <template <class T> class T> class N;

I think this would be the most obvious syntax, but it doesn't seem to work:
template temp(template T(T1)){ }


My second question, is it possible to specialize by template arguments?
template temp(T : T!(T1 : int))
January 09, 2007
Xinok wrote:
> Is it possible to create template parameters in the D language?
> template <template <class T> class T> class N;
> 
> I think this would be the most obvious syntax, but it doesn't seem to work:
> template temp(template T(T1)){ }

Too complicated, and not powerful enough!

template temp(alias T) {
   T!(T1);
}

alias parameters are a generalisation of template template parameters.
T1 doesn't have to be a template, just anything that has a name.

> My second question, is it possible to specialize by template arguments?
> template temp(T : T!(T1 : int))

Yes.

template temp(alias T1: T!(int) )
{
}

And you can have default alias template arguments, too.

January 09, 2007
Don Clugston Wrote:

> template temp(alias T) {
>     T!(T1);
> }
> 
> alias parameters are a generalisation of template template parameters. T1 doesn't have to be a template, just anything that has a name.

I see template parameters as a 'self documenting' feature, so the developer knows two things:
1) The template is looking for a template
2) The dev knows what arguments the template needs

If you apply a template to an alias, you can basically make any template compatible with the template argument:

template a(int V, T){ }

template b(template T(T, int V)){ }

template al(T, int V){
	alias a!(V, T) al;
}

b!(al) // Makes template 'b' compatible with template 'a'

And regardless if you use an alias or template argument, you'd still have to define template 'al'.


> Yes.
> 
> template temp(alias T1: T!(int) )
> {
> }
> 
> And you can have default alias template arguments, too.
> 

I tried the following code:
template temp(alias T){
}

template temp(alias T : T!(int)){
}

And got the error:
template main.temp(alias T : T!(int)) conflicts with main.temp(alias T) at main.d(4)