Question about explicit template instantiation

Edward Diener eddielee_no_spam_here at tropicsoft.com
Mon Feb 11 14:54:30 PST 2008


Jarrett Billingsley wrote:
> "Edward Diener" <eddielee_no_spam_here at tropicsoft.com> wrote in message 
> news:fonlr1$2krb$1 at digitalmars.com...
> 
>> This is utterly confusing to me coming from C++. Instantiating templates 
>> in C++ produce a type. If a template instantiation is not a type, what is 
>> it ? Also how does one produce a type from a template in D ?
> 
> As Janice said, instantiating a template creates a namespace in which the 
> template parameters are replaced by the arguments given in the 
> instantiation.
> 
> C++'s templates are intrinsically bound to either classes or functions, and 
> instantiating a template in C++ gets you either a class or a function.
> 
> D's templates are more general; they simply declare a namespace in which one 
> or more declarations can exist, all parameterized by the template's 
> parameters.
> 
> It might help to know that this:
> 
> class A(T)
> {
>     ..
> }
> 
> is _exactly_ equivalent (and in fact turned into this by the compiler) to:
> 
> template A(T)
> {
>     class A
>     {
>         ...
>     }
> }
> 
> Why this works is because if a template contains exactly one declaration, 
> and that declaration has the same name as the template, referring to the 
> template instantiation refers to the symbol inside it.  So:
> 
> A!(int).A a;
> A!(int) b; // sugar for the previous line
> 
> Function templates work similarly.
> 
> void foo(T)()
> {
>     ...
> }
> 
> ==
> 
> template foo(T)
> {
>     void foo()
>     {
> 
>     }
> }
> 
> So this function can be called either as foo!(int)() or as foo!(int).foo().
> 
> This extends to any kind of declaration.
> 
> template A(T, U)
> {
>     T t;
>     U u;
> }
> 
> template A(T)
> {
>     // an alias is a declaration too.
>     alias A!(T, T) A;
> }
> 
> alias A!(int, float) one; // one.t is int, one.u is float
> 
> // we don't have to say A!(char).A
> alias A!(char) two; // both two.t and two.u are char
> 
> You can have more than one declaration in a template, but then the 
> "automatic symbol use" magic stops happening. 

Thanks for the explanation !




More information about the Digitalmars-d mailing list