2010-07-04 142 views
0

C++中的pair類的定義中有兩個typedef。他們有什麼用途?代碼中沒有使用它們!C++對模板結構聲明模糊!

template <class T1, class T2> struct pair 
{ 
    typedef T1 first_type; 
    typedef T2 second_type; 

    T1 first; 
    T2 second; 
    pair() : first(T1()), second(T2()) {} 
    pair(const T1& x, const T2& y) : first(x), second(y) {} 
    template <class U, class V> 
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { } 
} 
+0

在* what * code中沒有用處爲了得出這些類型定義沒有被使用的結論,你檢查了哪些特定的代碼體? – AnT 2010-07-04 18:39:17

+0

在宣言本身! – Kamran 2010-07-04 19:45:57

回答

7

他們只是在這裏爲你提供方便,所以你可以在你的代碼中使用它們。 C++不具有反射模型,所以這是你「知道」他們是什麼類型的 假設你定義自己對

的typedef對MyPair的唯一途徑;

然後你可以使用

MyPair :: first_type
MyPair :: second_type

例如,

MyPair::first_type my_first(MyPair& pair) 
{ 
    return pair.first; 
} 

這樣你就不會需要研究並在代碼中的任何地方替換,如果您更改原始定義o f MyPair。

5

它,以允許其他部分的代碼以聲明變量的類型,而不必類型參數的直接訪問(T1 & T2)。類似的,更少的微不足道的,例如是在容器類的類型定義:

vector<int>::iterator curNum; 
for(curNum = someVect.begin(); curNum != someVect.end(); curNum++) 
    ; //do stuff 

這使用在載體中模板中定義來創建curNum typedef的iterator。這將是稍差有用來的C++ 0x的auto關鍵字:

for(auto curNum = someVect.begin(); curNum != someVect.end(); curNum++) 
    ; 
1

他們的對象被創建後,可以被引用傳入的T1和T2類型的公共別名。

3

這樣你就可以使用例如代碼來引用代碼中的類型。 pair<int,string>::first_type myVariable,或者您已經鍵入了特定的模板風格,然後MyPair::first_type myVariable