Статический член в классе шаблона. Один и тот же счетчик для всех типов класса

#c #class #templates #variables #static

#c #класс #шаблоны #переменные #статический

Вопрос:

Я просто хочу получить доступ к статическому члену шаблонного класса. Я знаю, как его инициализировать, но моя проблема заключается в его печати для всех типов, а не только для одного типа за раз.

Соответствующие части моего кода:

 #include <iostream>
using namespace std;
template <class T>
class SortArr
{
private:
    T* arr;
    int size;
    static int count;
    static int sum;
public:
void print_static()const
}
//the print function
template <class T>
void SortArr<T>::print_static()const
{
    cout << count << endl;
    cout << sum << endl;
}
//count all the objects
//sum of all the araay sizes

template<class T>
int SortArr<T>::count = 0;
template<class T>
int SortArr<T>::sum = 0;

int main()
{
SortArr<int>print_static();//just integer num
}
//How should I approach static variables by considering all objects of all types?
count for example will count both the integer and double objects
  

Комментарии:

1. Если вам нужен счетчик для всех установлений шаблона класса, вам понадобится не шаблонный базовый класс, который предоставляет статический счетчик для всех потомков шаблона класса.

2. пример

Ответ №1:

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

 struct Counter {
    static int count;
};
int Counter::count = 0;

template <typename T> 
class SortArr : Counter {
     // ...
};
  

Для иллюстрации рассмотрим

 #include <iostream>

template <size_t ID>
struct Counter {
    static int value;
};

template <size_t ID>
int Counter<ID>::value = 0;

int main() {
    Counter<0>::value = 24;
    Counter<42>::value = 123;
    std::cout << Counter<0>::value << ' ' << Counter<42>::value;
}
  

Вывод 24 123 , потому что каждый экземпляр Counter имеет свой собственный value .

С другой стороны, это

 #include <iostream>

struct Counter {
    static int value;
};
int Counter::value = 0;

template <typename T>
struct Foo : Counter {
    using Counter::value;
};

int main() {
    Foo<int>::value = 42;
    Foo<double>::value = 123;
    std::cout << Foo<int>::value << ' ' << Foo<double>::value;
}
  

Имеет вывод 123 123 , потому что все экземпляры Foo имеют один и тот же счетчик.

Комментарии:

1. Может быть, стоит упомянуть встроенную инициализацию статического члена?