↑ ↓ ← → Colin JN Breame <Colin_member pathlink.com>
writes:
I've been reading the template section in the reference manual. It says:
"Multiple instantiations of a TemplateDeclaration with the same
TemplateParameterList all will refer to the same instantiation."
Is this a feature or a flaw?
"Templates cannot be used to add non-static members or functions to classes."
Is this something that will be rectified in the future?
I'm I right in saying that you can add members and functions to a struct using a
template? If so, is it the case that there will only be one instance of that
struct?
Thanks
↑ ↓ ← → Ilya Minkov <minkov cs.tum.edu>
writes:
Colin JN Breame schrieb:
I've been reading the template section in the reference manual. It says:
"Multiple instantiations of a TemplateDeclaration with the same
TemplateParameterList all will refer to the same instantiation."
Is this a feature or a flaw?
I think you misunderstand this phrase. Templates generate code. This
feature guarantees that not multiple unrelated pieces of exactly same
mode are created for each module etc, but that doesn't matter how often
you instantiate a template, as long as it's one set of parameters, it
reuses this code over and over. This doesn't restrict you in any way,
e.g. you make a template of a class which takes one type argument, then
you can create multiple instances of it with an argument of (int), then
make multiple class instances of these, but all instances will still
have the same ClassInfo, meaning that they belong to the same class. If
it weren't so, the templates would be nearly useless, and bloat would be
unbound.
"Templates cannot be used to add non-static members or functions to classes."
Is this something that will be rectified in the future?
Recall that a VTable is a seqence of function pointers. For each
possible outside instantiation of an in-class template containing
virtuals, it would add some more functions. The problem is, multiple
instantiations from outside would create conflicting class definitions.
So it is not possible. What might be possible, is instantiations within
a class - but it's probably not so useful.
If you inherit from a class template, you clearly get virtuals, and/or
statics, whatever you want. I'm not exactly clear whether it interferes
with single inheritance (i.e. whether templates can "mix in") - i'm not
a template expert...
I'm I right in saying that you can add members and functions to a struct using
a
template?
Never tried, but my guess is yes. Otherwise it would be a bug. :>
If so, is it the case that there will only be one instance of that
struct?
Definately not. This will just be the same struct. You have to
distunguish between template instantiation (which is code geneation),
and, if template represents a type, instantiations of that type.
-eye
↑ ↓ ← → Colin JN Breame <Colin_member pathlink.com>
writes:
In article <c6aos8$2uuk$1 digitaldaemon.com>, Ilya Minkov says...
[snip]
This doesn't restrict you in any way,
Thanks for clearing that up.
[snip]
If you inherit from a class template, you clearly get virtuals, and/or
statics, whatever you want. I'm not exactly clear whether it interferes
with single inheritance (i.e. whether templates can "mix in") - i'm not
a template expert...
I'm still confused. Does this mean that I can have a template as such:
template Foo(D)
{
class Bar {
D d;
}
}
Thanks again.
↑ ↓ ← → J Anderson <REMOVEanderson badmama.com.au>
writes:
Colin JN Breame wrote:
In article <c6aos8$2uuk$1 digitaldaemon.com>, Ilya Minkov says...
[snip]
This doesn't restrict you in any way,
Thanks for clearing that up.
[snip]
If you inherit from a class template, you clearly get virtuals, and/or
statics, whatever you want. I'm not exactly clear whether it interferes
with single inheritance (i.e. whether templates can "mix in") - i'm not
a template expert...
I'm still confused. Does this mean that I can have a template as such:
template Foo(D)
{
class Bar {
D d;
}
}
Thanks again.
The code your presented works so I don't see your question. Note that
if you don't care able your namespaces you can also do this:
class Bar(D)
{
D d;
}
--
-Anderson: http://badmama.com.au/~anderson/
↑ ↓ ← → "Matthew" <matthew.hat stlsoft.dot.org>
writes:
"Templates cannot be used to add non-static members or functions to classes."
Is this something that will be rectified in the future?
This is something that is being changed for the DTL.
↑ ↓
← → Norbert Nemec <Norbert.Nemec gmx.de>
writes:
Colin JN Breame wrote:
"Templates cannot be used to add non-static members or functions to
classes."
Is this something that will be rectified in the future?
I'm I right in saying that you can add members and functions to a struct
using a
template? If so, is it the case that there will only be one instance of
that struct?
If I understand this correctly, it is rather fundamental and cannot be
changed in the future. The example given is:
class Foo
{
template TBar(T)
{
T xx; // Error
int func(T) { ... } // Error
static T yy; // Ok
static int func(T t, int y) { ... } // Ok
}
}
now, if you could do something like
Foo x = new Foo();
int a = x.TBar!(int).xx;
you would have accessed the non-static member xx. But how many such members
does the class actually have? What would the memory layout of an object be?
For every instantiation of TBar you would add new members to the class, so
the internal memory layout would depend on the order of instantiations,
which is something the compiler cannot read from the definition of the
class.
Same thing for non-static member functions that get entries in the VMT.
For static members, there is no problem, since they do not affect the
interal memory layout of the class. The compiler just has to allocate
memory for global variables, but that is not a problem.