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

StackOverflow https://stackoverflow.com/questions/2220975

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top