我真的不知道該怎麼形容這一點,但是這是代碼:如何從專用於自身的模板派生類?
class A : public std::vector<A>
{
};
//....
A a;
a.push_back(a);
它能做什麼和你爲什麼要這麼做?
我真的不知道該怎麼形容這一點,但是這是代碼:如何從專用於自身的模板派生類?
class A : public std::vector<A>
{
};
//....
A a;
a.push_back(a);
它能做什麼和你爲什麼要這麼做?
這是curiously recurring template pattern(CRTP)。
它允許你實現靜態多態性。
但是,使用std::vector
作爲基類是不好的做法,因爲它沒有虛擬析構函數。
我剛使用過vector,因爲我不想創建一個模板類來證明一個觀點:)。但你是對的。將研究它。謝謝 – 2012-01-29 15:37:58
子類是終止泛型。該向量只能包含A
類型的對象,而不能是任意向量。
現在,你爲什麼要建立一個包含自己的對象我做不是知道。但有理由這樣做。例如,對於單元測試,要確保算法能夠處理包含循環的集合。一個天真的算法可能會陷入無限循環,因此單元測試失敗。
由於它是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=[]
]
]
]
默認構造'的std ::矢量'實際上並不包含任何A的,所以這是很酷。你有沒有嘗試第二次push_back? – 2012-01-29 15:41:05
http://stackoverflow.com/questions/4173254/what-is-the-curiously-recurring-template-pattern-crtp – 2012-01-29 15:51:20
@BoPersson我現在做了,它的工作原理。 – 2012-01-29 15:51:36