在c ++中对类的定义中有两个typedef。它们是为了什么?在代码中没有使用它们!
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 :(得分:7)
它们只是为了您的方便,所以您可以在代码中使用它们。 C ++没有反射模型,所以这是你“知道”它们是什么类型的唯一方式 假设您定义了自己的对
typedef对MyPair;
然后你可以使用
MyPair :: first_type
MyPair :: second_type
例如,
MyPair::first_type my_first(MyPair& pair)
{
return pair.first;
}
如果您更改MyPair的原始定义,则无需在代码中的任何地方进行研究和替换。
答案 1 :(得分:5)
允许其他代码片段声明类型的变量,而无需直接访问类型参数(T1和T2)。类似的,不那么简单的例子是容器类中的typedef:
vector<int>::iterator curNum;
for(curNum = someVect.begin(); curNum != someVect.end(); curNum++)
; //do stuff
这使用向量模板中定义的typedef iterator
来创建curNum
。 C ++ 0x的auto
关键字:
for(auto curNum = someVect.begin(); curNum != someVect.end(); curNum++)
;
答案 2 :(得分:3)
这样您就可以使用例如代码来引用代码中的类型。 pair<int,string>::first_type myVariable
,或者如果您已经键入了特定版本的模板MyPair::first_type myVariable
。
答案 3 :(得分:1)
它们是传入的T1和T2类型的公共别名,可以在构造对象后引用它们。