最近在群里面看到这样一个语句:typedef typename T::value_type _type; 我的第一反应这是一个自定义类型,没错确实是一句自定义类型,但这和我们平常见到的自定义类型又有不同,T::value_type 这块会让大多数人和很不解。其实他的意义就是:这个T必须含有value_type这个成员,也就是说T必须是个类或者命名空间,如果还不明白继续往下看。
[cpp]
// 自定义类型1-这是常规自定义类型的变形,首先传入的classType应该是个类且必须有value_type这个成员,例如STL中的类.
template
struct CCustomType
{
typedef typename classType::value_type custom_type;
custom_type data;
};
使用CCustomType自定义类型:
[cpp]
CCustomType
string_.data = 'c'; // string::value_type 是char 类型,从下面的basic_string就可以看出
CCustomType
string_2.data = 'x'; // char
CCustomType> list_;
list_.data = "you are so beautiful"; // char*
CCustomType
set_.data = 512139461; // UINT
声明CCustomType
分析:
[cpp]
//按照上面的原型,声明一个pair类型变量 pair_test
map
// 通过源码一步步跟进查看这个map的value_type,first:const int ,second:char*
// 1.map的value_type来自_Mybase的成员value_type:
typedef typename _Mybase::value_type value_type;
// 2.继续跟发现_Mybase是个模板类,由_Tmap_traits构造:
typedef _Tree<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, false> > _Mybase;
// 3.就要揭晓答案了,跟_Tmap_traits发现原来他自定义了pair类型:
typedef pair
// 4.这就是为什么map的key是个const类型,也表明上面的自定义类型CCustomType的data成员实际上是个pair
那么有什么办法可以给自定义类型CCustomType的data成员赋值呢,答案是通过构造函数,我们先对CCustomType做下变形:
[cpp]
template
struct CCustomTypeEx
{
typedef typename classType::value_type custom_type;
custom_type data;
CCustomTypeEx() {}
CCustomTypeEx(keyType _key,valueType _value)
:data(_key,_value) // 调用classType::pair的构造函数
{
}
}; www.2cto.com
[cpp]
CCustomTypeEx
总结:关于CCustomType