奇特的遞歸模板模式(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;
- }