#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. Может быть, стоит упомянуть встроенную инициализацию статического члена?