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