Статический член шаблона С++, один экземпляр для каждого типа шаблона?

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

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

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

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


person user240137    schedule 08.02.2010    source источник


Ответы (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
person Yacoby    schedule 08.02.2010
comment
Поскольку вопрос касается статических элементов, пример программы был бы понятнее, если бы он не создавал никаких экземпляров Foo‹T›. Вместо того, чтобы назначать и распечатывать bar1.s, вы можете вместо этого использовать Foo‹int›::s. - person Gareth Stockwell; 08.02.2010
comment
@jamesdlin Уг. Фиксированный. Я не должен пытаться перевернуть логику в предложении, а затем должным образом не прочитать корректуру. - person Yacoby; 08.02.2010
comment
@gareth Правильное замечание, и я виню тот факт, что в тот момент я не пил кофе. Исправлен упрощенный код. - person Yacoby; 08.02.2010
comment
@Yacoby: Как насчет Foo<int>::bar = 3 в другом блоке компиляции? :) Для полноты картины... - person vladr; 06.12.2012

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

person villintehaspam    schedule 08.02.2010
comment
спасибо, это было коротко, но прояснило все, что мне нужно было знать :) - person user240137; 08.02.2010

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

person Peter Alexander    schedule 08.02.2010

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

person Thirler    schedule 08.02.2010
comment
Шаблоны C++ на самом деле являются копиями классов: это не имеет смысла. 0) есть также функции шаблона и функции-члены шаблона, 1) определить копию. Я предполагаю, что вы имеете в виду, что каждый экземпляр шаблона класса представляет новый тип класса. - person Sebastian Mach; 08.02.2010
comment
Да, в отличие от Java, С++ внутренне создает копию класса с заполненной частью шаблона. - person Thirler; 08.02.2010