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