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++ шаблоны фактически являются копиями классов. Я думаю, что в вашем примере будет один статический экземпляр на экземпляр шаблона.

Другие вопросы по тегам