C++:CRTP:如何知道所有对象计数

C++: CRTP: How to know all objects count?

本文关键字:对象 何知道 CRTP C++      更新时间:2023-10-16

我需要你们在CRTP中的帮助(可能是基本问题,对此感到抱歉)。这是基于以下帖子:C++对象生存期分析如何统计模板类的CRTP子类数量?

使用 CRTP,我们可以计算为每个类类型创建的对象数量。但是,使用这种方法,我找不到系统中创建的对象总数。

有什么办法可以做到这一点吗?

提前谢谢。

问候SNR

此解决方案包含(每个类和全局)计数器的代码。

extern size_t Global_counter; //In .cpp file define it: size_t Global_counter = 0;
template <class T>
class CountedClass
{
protected:
  static size_t this_class_counter;
public:
  static size_t GetThisClassCounter()
  {
    return this_class_counter;
  }
  static size_t GetGlobalCounter()
  {
    return Global_counter;
  }
  CountedClass()
  {
    ++this_class_counter;
    ++Global_counter;
  }
};
template <class T>
size_t CountedClass<T>::this_class_counter = 0;

示例用法:

class A : public CountedClass<A>
{
public:
  A() : CountedClass<A>()
  {
  }
};
class B : public CountedClass<B>
{
public:
  B() : CountedClass<B>()
  {
  }
};
A a1;
A a2;
B b2;
std::cout<<A::GetThisClassCounter(); //prints 2
std::cout<<A::GetGlobalCounter(); //prints 3
std::cout<<B::GetThisClassCounter(); //prints 1
std::cout<<B::GetGlobalCounter(); //prints 3

让所有类都继承自一个公共基类,该基类保留一个计数器,类似于

class Counter {
  static int count = 0;
protected:
  Counter() { count++; }
public:
  int getCount() { return count; }
};

由于要计算所有实例,因此不需要区分不同的派生类,因此不需要 CRTP。

如果需要这两个计数,则可以使用类似于上面的类作为 CRTP 类的基类。