2010-07-04 115 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