Question about explicit template instantiation
Jesse Phillips
jessekphillips at gmail.com
Sun Feb 10 14:58:51 PST 2008
On Sun, 10 Feb 2008 17:31:36 -0500, Edward Diener wrote:
> Janice Caron wrote:
>> On 10/02/2008, Edward Diener <eddielee_no_spam_here at tropicsoft.com>
>> wrote:
>>>> template MyNamespace(T)
>>>> {
>>>> int x;
>>>> }
>>
>>> This is confusing to me coming from C++. In C++ instantiating a class
>>> template produces a type. Is that not the way D works ?
>>
>> That's /exactly/ the way that D works. With CLASS templates, D works
>> just like C++. No problem. Compare: c++
>>
>> template<class T> class A
>> {
>> int x;
>> };
>>
>> A<int> a1;
>> A<double> a2;
>>
>> and the D equivalent:
>>
>> class A(T)
>> {
>> int x;
>> }
>>
>> auto a1 = new A!(int);
>> auto a2 = new A!(double);
>>
>> They're exactly the same, except that D has nicer syntax. I don't think
>> /class/ templates are confusing you at all! I think what's confusing
>> you is that in D you can have /namespace/ templates, which don't exist
>> in C++.
>
> The explanation for Class Templates in the D1 doc does not explain
> anything at all. That is why I assumed the template A(T) notation
> referred to the equivalent of the C++ class template.
>
>
>> Let me make an approximate C++ translation. Here's the D again:
>>
>> template A(T)
>> {
>> int x;
>> }
>>
>> That is roughly equivalent to, in C++
>>
>> namespace A_int
>> {
>> int x;
>> }
>>
>> namespace A_float
>> {
>> int x;
>> }
>>
>> namespace A_double
>> {
>> int x;
>> }
>>
>> ...and so on for every imaginable type. Now it should be clear to you
>> that A_int::x is a different variable from A_float::x, yes?
>
> Now I understand. I was surely fooled by the doc.
>
>
>> For a namespaces to be "instantiated" just means that the corresponding
>> chunk of code is there. To be /not/ instantiated would mean that it
>> isn't there - which is just as well really, because there are in
>> infinite number of possible types!
>>
>> To instantiate a namespace template, you only have to refer to it. I
>> doesn't matter how.
>>
>> Clear?
>
> I think so. Instantiating a namespace template merely puts the
> equivalent code, with the types you instantiate it with substituted each
> time those types are referred to in the namespace, directly into your
> source.
>
> I still do not understand what the object used for the instantiation is.
> In your example above what is:
>
> A!(int)
>
> ? Is it some kind of namespace ? Can I say:
>
> A!(int) x;
>
> ? If so, what is x ?
Well, you can't write A!(int) x; unless you precede it with alias.
If we have:
template A(T) { T f; }
I'm new to templates so I don't really know how to say what A!(int) is,
but I think a good way to think of it as declaring an instance of a
struct.
struct B { int f };
where B = A!(int);
More information about the Digitalmars-d
mailing list