C++ статический член шаблона, один экземпляр для каждого типа шаблона?
Обычно статические члены / объекты одного класса одинаковы для каждого экземпляра класса, имеющего статический член / объект. В любом случае, что делать, если статический объект является частью класса шаблона и также зависит от аргумента шаблона? Например, вот так:
template<class T>
class A{
public:
static myObject<T> obj;
}
Если бы я бросил один объект A как int
и еще один как float
Я думаю, было бы два obj
по одному для каждого типа?
Если бы я создал несколько объектов типа A int
и несколько float
с, было бы еще два obj
случаи, так как я использую только два разных типа?
4 ответа
Статические члены различны для каждой другой инициализации шаблона. Это связано с тем, что каждая инициализация шаблона представляет собой отдельный класс, который генерируется компилятором при первом обнаружении этой конкретной инициализации шаблона.
Тот факт, что статические переменные-члены различаются, показан этим кодом:
#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;
}
Что приводит к
1,2
A<int>
а также A<float>
это два совершенно разных типа, вы не можете использовать их безопасно. Два случая A<int>
будет использовать тот же статический объект myObject.
Статических переменных-членов столько же, сколько и классов, и это в равной степени относится к шаблонам. Каждый отдельный экземпляр класса шаблона создает только одну статическую переменную-член. Количество объектов этих шаблонных классов не имеет значения.
В C++ шаблоны фактически являются копиями классов. Я думаю, что в вашем примере будет один статический экземпляр на экземпляр шаблона.