天天看点

templates — C++模板的应用<奇特的递归模板模式>

http://www.verydemo.com/demo_c128_i6615.html

奇特的递归模板模式(CRTP)这个奇特的名字代表了类实现技术中一种通用的模式,即派生类将本身作为模板参数传递给基类;

CRTP的一个简单的应用是记录某个类的对象构造的总个数。数对象个数很简单,只需引入一个整数类型的静态数据成分,分别在构造与析构中进行递增与递减操作,不过,要在每个类中都这么写非常繁琐,有了CRTP,我们可以写入一个模板来实现;

实例代码:

查看文本 打印 ?

  1. #include <iostream>  
  2. #include <stddef.h>  
  3. //CRTP template class object  
  4. template <typename CountedType>  
  5. class ObjectCounter{  
  6. private:  
  7.     static size_t count;  
  8. protected:  
  9.     ObjectCounter(){  
  10.         ++ObjectCounter<CountedType>::count;  
  11.     };  
  12.     ObjectCounter(ObjectCounter<CountedType> const&){  
  13.         ++ObjectCounter<CountedType>::count;  
  14.     }  
  15.     ~ObjectCounter(){  
  16.         --ObjectCounter<CountedType>::count;  
  17.     }  
  18. public:  
  19.     static size_t _live(){  
  20.         return ObjectCounter<CountedType>::count;  
  21.     }  
  22. };  
  23. template <typename CountedType>  
  24. size_t ObjectCounter<CountedType>::count = 0;  
  25. template <typename CharT>  
  26. class MyString : public ObjectCounter<MyString<CharT> >{  
  27. };  
  28. int _tmain(int argc, _TCHAR* argv[])  
  29. {  
  30.     MyString<char> s1, s2;  
  31.     MyString<wchar_t> ws;  
  32.     std::cout << MyString<char>::_live() << std::endl;  
  33.     std::cout << MyString<char>::_live() << std::endl;  
  34.     std::cout << MyString<wchar_t>::_live() << std::endl;  
  35.     getchar();  
  36.     return 0;