http://www.verydemo.com/demo_c128_i6615.html
奇特的递归模板模式(CRTP)这个奇特的名字代表了类实现技术中一种通用的模式,即派生类将本身作为模板参数传递给基类;
CRTP的一个简单的应用是记录某个类的对象构造的总个数。数对象个数很简单,只需引入一个整数类型的静态数据成分,分别在构造与析构中进行递增与递减操作,不过,要在每个类中都这么写非常繁琐,有了CRTP,我们可以写入一个模板来实现;
实例代码:
查看文本 打印 ?
- #include <iostream>
- #include <stddef.h>
- //CRTP template class object
- template <typename CountedType>
- class ObjectCounter{
- private:
- static size_t count;
- protected:
- ObjectCounter(){
- ++ObjectCounter<CountedType>::count;
- };
- ObjectCounter(ObjectCounter<CountedType> const&){
- ++ObjectCounter<CountedType>::count;
- }
- ~ObjectCounter(){
- --ObjectCounter<CountedType>::count;
- }
- public:
- static size_t _live(){
- return ObjectCounter<CountedType>::count;
- }
- };
- template <typename CountedType>
- size_t ObjectCounter<CountedType>::count = 0;
- template <typename CharT>
- class MyString : public ObjectCounter<MyString<CharT> >{
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- MyString<char> s1, s2;
- MyString<wchar_t> ws;
- std::cout << MyString<char>::_live() << std::endl;
- std::cout << MyString<char>::_live() << std::endl;
- std::cout << MyString<wchar_t>::_live() << std::endl;
- getchar();
- return 0;
- }