天天看點

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;