所谓CRTP,是Curiously Recurring Template Pattern的缩写,奇特的对规模板模式,这个奇特的名字代表了类实现技术中一种通用的模式,即将派生类本身作为模板参数传递给基类,
利用CRTP可以很好的实现了对类定义的对象的个数计数,代码如下:
//
"ObjectCounter.h"
#include < cstddef >
template < typename CountedType >
class ObjecterCounter
... {
private:
static size_t count;
protected:
//构造函数;
ObjecterCounter()
...{
++ObjecterCounter<CountedType>::count;
}
//拷贝构造函数;
ObjecterCounter(ObjecterCounter<CountedType> const&)
...{
++ObjecterCounter<CountedType>::count;
}
//析构函数;
~ObjecterCounter()
...{
--ObjecterCounter<CountedType>::count;
}
public:
static size_t live()
...{
return ObjecterCounter<CountedType>::count;
}
} ;
// 用0来初始化count;
template < typename CountedType >
size_t ObjecterCounter < CountedType > ::count = 0 ;
// Main.cpp
#include " ObjectCounter.h "
#include < iostream >
template < typename CharT >
class MyString : public ObjecterCounter < MyString < CharT > >
... {
} ;
void main()
... {
using namespace std;
MyString<char> s1, s2;
MyString<wchar_t> ws;
cout<<"number of MyString<char>: "
<<MyString<char>::live()<<endl;
cout<<"number of MyString<wchat_t>: "
<<ws.live()<<endl;
}
#include < cstddef >
template < typename CountedType >
class ObjecterCounter
... {
private:
static size_t count;
protected:
//构造函数;
ObjecterCounter()
...{
++ObjecterCounter<CountedType>::count;
}
//拷贝构造函数;
ObjecterCounter(ObjecterCounter<CountedType> const&)
...{
++ObjecterCounter<CountedType>::count;
}
//析构函数;
~ObjecterCounter()
...{
--ObjecterCounter<CountedType>::count;
}
public:
static size_t live()
...{
return ObjecterCounter<CountedType>::count;
}
} ;
// 用0来初始化count;
template < typename CountedType >
size_t ObjecterCounter < CountedType > ::count = 0 ;
// Main.cpp
#include " ObjectCounter.h "
#include < iostream >
template < typename CharT >
class MyString : public ObjecterCounter < MyString < CharT > >
... {
} ;
void main()
... {
using namespace std;
MyString<char> s1, s2;
MyString<wchar_t> ws;
cout<<"number of MyString<char>: "
<<MyString<char>::live()<<endl;
cout<<"number of MyString<wchat_t>: "
<<ws.live()<<endl;
}