Я хотел бы иметь счетчики для каждого типа класса, который когда-либо создавался. В качестве отправной точки кто-то предложил этот подход в качестве примера:
class Person
{
public:
Person() {
objects.push_back(this);
}
virtual ~Person() {
objects.erase(this);
}
static void print_types()
{
for (auto pers : container)
{
std::cout << typeid(*pers).name() << "\n";
}
}
private:
static std::set<const Person*> objects;
};
class Employee : public Person
{
};
class Employee2 : public Employee
{
};
Каждый раз, когда создается один из классов, я отслеживаю объекты и могу использовать print_types (), чтобы узнать, сколько из какого типа я создал до сих пор. Обратите внимание, что Employee2 наследуется от Employee, а не от Person (мне нужно, чтобы это работало для цепного наследования)
Я бы хотел расширить это, чтобы у меня было два счетчика для каждого типа: созданный и живой. Проблема в том, что вы не можете легко управлять счетчиками из конструктора / деструктора базового класса Person, потому что typeid (* this) будет возвращать тип базового класса при вызове из конструктора / деструктора.
Другим предложением было использование шаблона CRTP, но это не работает, когда вы используете цепочечное наследование.
Есть ли другой способ реализовать такие счетчики?