C ++:CRTP:如何知道所有对象的数量?

时间:2014-02-22 00:03:04

标签: c++ crtp

在CRTP中,我需要你们帮助(可能是基本问题,对不起)。 这基于以下帖子: C++ object lifetime profiling How to count the number of CRTP subclasses of a template class?

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

有没有办法实现这个目标?

提前致谢。

此致 SNR

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

让所有类都从一个保留计数器的公共基类继承,比如

class Counter {
  static int count = 0;

protected:
  Counter() { count++; }

public:
  int getCount() { return count; }
};

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

如果你想要两个计数,你可以使用类似上面的类作为CRTP类的基类。