2012-01-29 51 views
5

我真的不知道該怎麼形容這一點,但是這是代碼:如何從專用於自身的模板派生類?

class A : public std::vector<A> 
{ 
}; 

//.... 

A a; 
a.push_back(a); 

它能做什麼和你爲什麼要這麼做?

回答

4

這是curiously recurring template pattern(CRTP)
它允許你實現靜態多態性

但是,使用std::vector作爲基類是不好的做法,因爲它沒有虛擬析構函數。

+0

我剛使用過vector,因爲我不想創建一個模板類來證明一個觀點:)。但你是對的。將研究它。謝謝 – 2012-01-29 15:37:58

0

子類是終止泛型。該向量只能包含A類型的對象,而不能是任意向量。

現在,你爲什麼要建立一個包含自己的對象我做不是知道。但有理由這樣做。例如,對於單元測試,要確保算法能夠處理包含循環的集合。一個天真的算法可能會陷入無限循環,因此單元測試失敗。

1

由於它是A s的矢量而不是A* s,因此a本身不能包含它自己。但是push_back會在呼叫時向該向量添加a的副本。

例子:

#include <vector> 
#include <iostream> 
using namespace std; 
class A : public std::vector<A> 
{ 
    public: 
     void print(int level=0){ 
      for (int i=0;i<level;i++) cout<<" "; 
      cout << "0x" << hex << (unsigned int)this << "=["; 
      if (size()){ 
       cout << endl; 
       for (int i=0; i<size(); i++) 
        (*this)[i].print(level+1); 
       for (int i=0;i<level;i++) cout<<" "; 
      } 
      cout <<"]"<<endl; 
      if(!level) cout << endl; 
     } 

}; 

int main(){ 
    A a; 
    for (int i=1;i<=3;i++){ 
     a.push_back(a); 
     a.print(); 
    } 
    return 0; 
} 

和輸出:

0xbff4fa20=[ 
    0x9ec2008=[] 
] 

0xbff4fa20=[ 
    0x9ec2018=[] 
    0x9ec2024=[ 
    0x9ec2038=[] 
    ] 
] 

0xbff4fa20=[ 
    0x9ec2048=[] 
    0x9ec2054=[ 
    0x9ec20a0=[] 
    ] 
    0x9ec2060=[ 
    0x9ec2080=[] 
    0x9ec208c=[ 
     0x9ec2008=[] 
    ] 
    ] 
] 
相關問題