C ++ statische Vorlage Mitglied, eine Instanz für jeden Template-Typen?
Frage
In der Regel statische Elemente / Objekte einer Klasse sind die gleichen für jede Instanz der Klasse die statische Element / Objekt mit. Sowieso was ist, wenn das statische Objekt Teil einer Template-Klasse ist und hängt auch von dem Template-Argumente? Zum Beispiel wie folgt aus:
template<class T>
class A{
public:
static myObject<T> obj;
}
Wenn ich ein Objekt von A wie int
und eine anderen als float
werfen würde, ich denke, es zwei obj
für jeden Typen sein würde?
Wenn ich mehrere Objekte von A als Typ int
und mehr float
s schaffen würde, wäre es immer noch zwei obj
Instanzen sein, da ich nur zwei verschiedene Arten verwendet habe?
Lösung
Statische Elemente sind für jede diffrent Vorlage Initialisierung. Dies liegt daran, dass jede Vorlage Initialisierung eine andere Klasse, die durch den Compiler das erste Mal, dass bestimmte Initialisierung der Vorlage trifft erzeugt wird.
Die Tatsache, dass statische Membervariablen unterschiedlich sind, wird durch diesen Code dargestellt:
#include <iostream>
template <class T> class Foo {
public:
static int bar;
};
template <class T>
int Foo<T>::bar;
int main(int argc, char* argv[]) {
Foo<int>::bar = 1;
Foo<char>::bar = 2;
std::cout << Foo<int>::bar << "," << Foo<char>::bar;
}
Was ergibt
1,2
Andere Tipps
A<int>
und A<float>
sind zwei völlig verschiedene Arten, können Sie nicht sicher zwischen ihnen werfen. Zwei Fälle von A<int>
werden, obwohl die gleiche statische myObject teilen.
Es gibt so viele statischen Membervariablen wie es Klassen, und dies gilt auch für Vorlagen. Jede einzelne Instantiierung einer Template-Klasse schafft nur eine statische Membervariable. Die Anzahl der Objekte dieser Klassen Templat ist irrelevant.
In C ++ Vorlagen sind tatsächlich Kopien von Klassen. Ich denke, in Ihrem Beispiel gibt es eine statische Instanz pro Vorlageninstanz wäre.