最近看到一篇文章说要实现一个计数器的功能,于是通过思索,设计了一个灵活可用性高的对象计数器。
里面闪烁着 很多的火花。
template<class T>
class Object_counter{
template<class ObejctType>
friend int get_object_count(ObejctType& obj);
template<class ObejctType>
friend int get_object_count();
protected:
Object_counter() { ++m_count ; }~Object_counter(){ --m_count ; }
private:
static int m_count;
};
template<class T>
int Object_counter<T>::m_count = 0;
//应该静态断言 ObjectType 为ObjectCounter<T>的子类 -----------可以考虑Loki库里的 静态断言+父类子类判断
template<class ObejctType>
int get_object_count(ObejctType& obj)
{
return Object_counter<ObejctType>::m_count;
}
template<class ObejctType>
int get_object_count()
{
return Object_counter<ObejctType>::m_count;
}
测试---
class A : private Object_counter<A>
{};
class B: public A , private Object_counter<B>
{};
// 没继承 计数器,计数永远为0
class C
{};
B b1 , b2 , b3 , b4;
A a1;
C c1;
cout << "B object number :"<< LK::get_object_count<B>() << endl;
cout << "A object number :"<< LK::get_object_count<A>() << endl;
cout << "C object number :"<< LK::get_object_count<C>() << endl;
cout << "B object number :"<< LK::get_object_count(b1) << endl;
cout << "A object number :"<< LK::get_object_count(a1) << endl;
cout << "C object number :"<< LK::get_object_count(c1) << endl;