C ++ статический член шаблона, один экземпляр для каждого типа шаблона? - PullRequest
11 голосов
/ 08 февраля 2010

Обычно статические члены / объекты одного класса одинаковы для каждого экземпляра класса, имеющего статический член / объект. В любом случае, что если статический объект является частью класса шаблона и также зависит от аргумента шаблона? Например, вот так:

template<class T>
class A{
public:
  static myObject<T> obj;
}

Если бы я бросил один объект A как int, а другой как float, я думаю, было бы два obj, по одному для каждого типа?

Если бы я создал несколько объектов типа A int и несколько float с, все равно было бы два экземпляра obj, поскольку я использую только два разных типа?

Ответы [ 4 ]

19 голосов
/ 08 февраля 2010

Статические члены различны для каждой другой инициализации шаблона. Это связано с тем, что каждая инициализация шаблона представляет собой отдельный класс, который генерируется компилятором при первом обнаружении этой конкретной инициализации шаблона.

Тот факт, что статические переменные-члены различаются, показан этим кодом:

#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
4 голосов
/ 08 февраля 2010

A<int> и A<float> - это два совершенно разных типа, вы не можете безопасно разыгрывать между ними. Однако два экземпляра A<int> будут использовать один и тот же статический объект myObject.

3 голосов
/ 08 февраля 2010

Статических переменных-членов столько же, сколько и классов, и это в равной степени относится к шаблонам. Каждое отдельное создание класса шаблона создает только одну статическую переменную-член. Количество объектов этих шаблонных классов не имеет значения.

1 голос
/ 08 февраля 2010

В C ++ шаблоны фактически являются копиями классов. Я думаю, что в вашем примере будет один статический экземпляр на экземпляр шаблона.

...