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;
- }