C ++ membro modello statico, un'istanza per ogni tipo di modello?
Domanda
Solitamente membri statici / oggetti di una classe sono gli stessi per ogni istanza della classe avente l'elemento / oggetto statico. Comunque che dire se l'oggetto statico è parte di una classe template e dipende anche l'argomento modello? Ad esempio, in questo modo:
template<class T>
class A{
public:
static myObject<T> obj;
}
Se avessi gettato un oggetto di A come int
e un altro come float
, credo che ci sarebbero due obj
, uno per ogni tipo?
Se avessi creare più oggetti di un tipo come int
e molteplici float
s, sarebbe ancora due istanze obj
, dal momento che sto usando solo due tipi diversi?
Soluzione
I membri statici sono diversi per ogni inizializzazione modello differente. Questo perché ogni inizializzazione template è una classe diversa generata dal compilatore la prima volta che rileva che specifica l'inizializzazione del modello.
Il fatto che le variabili membro statiche sono differenti è mostrato da questo codice:
#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;
}
che si traduce in
1,2
Altri suggerimenti
A<int>
e A<float>
sono due tipi completamente diversi, non puoi lanciare tra di loro in modo sicuro. Due istanze di A<int>
condivideranno lo stesso myObject statica però.
Ci sono tante variabili membro statiche in quanto vi sono classi e questo vale anche per i modelli. Ogni esemplificazione separata di una classe template crea una sola variabile membro statica. Il numero di oggetti di queste classi templated è irrilevante.
Nei modelli C ++ sono in realtà copie di classi. Credo che nel tuo esempio ci sarebbe un'istanza statico per esempio template.