自定义类型的思考

原文链接:http://blog.csdn.net/xiexievv/article/details/7910425


最近在群里面看到这样一个语句:typedef typename T::value_type _type; 我的第一反应认为这是一个自定义类型,后来查了下资料并实际动手写了几个例子也证实了我的想法,但这和我们平常见到的自定义类型又有不同,特别是T::value_type 这块会让大多数人很不解。其实他的意义就是:这个T必须含有value_type这个成员,也就是说T必须是个类或者命名空间,如果还不明白的请继续往下看。

[cpp]  view plain copy
  1. // 自定义类型1-这是常规自定义类型的变形,首先传入的classType应该是个类且必须有value_type这个成员,例如STL中的类.  
  2. template<class classType,class keyType = int,class valueType = char*>  
  3. struct CCustomType  
  4. {  
  5.     typedef typename classType::value_type custom_type;  
  6.     custom_type data;  
  7. };   


使用CCustomType自定义类型:

[cpp]  view plain copy
  1. CCustomType<string>   string_;  
  2. string_.data = 'c';                     // string::value_type 是char 类型,从下面的basic_string就可以看出  
  3.   
  4. CCustomType<basic_string<char,char_traits<char>,allocator<char>>>   string_2;  
  5. string_2.data = 'x';                        // char  
  6.   
  7. CCustomType<list<char*>>    list_;  
  8. list_.data = "you are so beautiful";                // char*  
  9.   
  10. CCustomType<set<UINT>>  set_;  
  11. set_.data = 512139461;                      //  UINT  

声明CCustomType<map<int,char*>,int,char*> pair_;
这里pair_.data 是map的成员value_type, 也就是pair类型,更具体的讲是pair<int,char*> 
在使用CCustomType<map<int,char*>,int,char*>之前,我们先看下stl中pair的用法:

[cpp]  view plain copy
  1. std::pair<int,char*> pair_1(2012,"hello world");      // 利用构造函数初始化pair_1  
  2. //  
  3. std::pair<int,char*> pair_2;  
  4. pair_2 = make_pair(1989,(char*)"hansen");           // ok make_pair赋值  
  5. //  
  6. pair_2.first = 2000;                        // ok   
  7. pair_2.second = "just test";                    // ok  
  8. //  
  9. map<int,char*> nMap;  
  10. nMap.insert(pair_1);                                  
  11. nMap.insert(pair_2);                          
  12.   
  13. CCustomType<map<int,char*>,int,char*> pair_; // ok map应该这样用,key是int型 ,value是char*类型  
  14. //(pair_.data).first = 2012; error C3892: “pair_”: 不能给常量赋.  
  15. //通过监视查看pair_.data.first是个const int类型为什么会变成const int, 我传入的可是<int,char*>类型啊, 应该是pair<int,char*>类型才对,开始我也有这个疑问...  
  16. (pair_.data).second = "that's ok";          // ok,value不是const的,可以赋值  

分析:

[cpp]  view plain copy
  1. //按照上面的原型,声明一个pair类型变量 pair_test  
  2. map<int,char*>::value_type pair_test(2013,"test test");  
  3.   
  4. // 通过stl的源码一步步跟进查看这个map的value_type, first:const int ,second:char*  
  5. // 1.map的value_type来自_Mybase的成员value_type:  
  6. typedef typename _Mybase::value_type value_type;  
  7. // 2.继续跟发现_Mybase是个模板类,由_Tmap_traits构造:  
  8. typedef _Tree<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, false> > _Mybase;  
  9. // 3.就要揭晓答案了,然后跟_Tmap_traits发现原来他自定义了pair类型:  
  10. typedef pair<const _Kty, _Ty> value_type;  
  11. // 4.这就是为什么map的key是个const类型,也表明上面的自定义类型CCustomType的data成员实际上是pair<const T,T>  

那么有什么办法可以给自定义类型CCustomType的data成员赋值呢,答案是通过构造函数,我们先对CCustomType做下简单变形:

[cpp]  view plain copy
  1. template<class classType,class keyType = int,class valueType = char*>  
  2. struct CCustomTypeEx  
  3. {  
  4.     typedef typename classType::value_type custom_type;           
  5.     custom_type data;  
  6.     CCustomTypeEx() {}  
  7.     CCustomTypeEx(keyType _key,valueType _value)  
  8.         :data(_key,_value)                  // 调用classType::pair的构造函数  
  9.     {  
  10.     }  
  11.   
  12. };  
[cpp]  view plain copy
  1. CCustomTypeEx<map<int,char*>,int,char*> pair_ex(1989,"hansen");     // ok  

总结:关于CCustomType<map,int,char*> pair_那个问题,其实在一开始我就偷换掉了概念,前面那条红色句子就理解不完全,单单认定pair_.data是个pair类型,坚信pair是可以在构造后赋值的,没错常规的pair 例如std::pair确实可以这样做, 但别忘记了CCustomType中关键的一句typedef typename classType::value_type custom_type;也就是说这个value_type一定要是classType的成员,所以pair_.data 应该是map::value_type类型,进一步就是pair<const int,char*>类型.

又是一个3点啊 ......收工.....睡觉.....



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值