Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67267
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 393
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-11 22:32
个人简介

曾经天真的以为做IT就是研究各种先进技术;工作后才知道99%的时候做的是体力活。在迷茫和痛苦中追寻前进的路标

文章分类
文章存档

2014年(5)

我的朋友

分类: C/C++

2014-09-21 10:30:10

C++爱好者在和pythonphp粉丝骂战时,经常会碰到一个难题“你们c++不支持动态数据类型,会大幅降低开发效率”


C++的语法要求在编译时确定变量的类型,属于静态数据类型语言。

静态数据类型的好处是在编程时一旦类型出错(例如对int变量写入string值),会在编译时报错。一旦编译通过,基本就不会存在类型错误的bug了。对于数万行的大型软件,在核心部分采用静态数据类型会更易于维护。


而支持动态数据类型的语言可以在运行时随意更改变量类型。

在实现多层map、制作可变参数通用api等几种情况下,动态数据类型可以大幅提高开发效率。


让我们来看一个小例子:
      
假如我们要在lua里写一个三层table,大概是这样:

  1. data = {}
  2. data["key1"] = {}
  3. data["key1"]["key2"] = {}
  4. data["key1"]["key2"]["key3"] = "邓小超"
      然后查找的时候:
  1. if data["key1"] ~= nil and data["key1"]["key2"] ~= nil then
  2.      print(data["key1"]["key2"]["key3"])
  3. end

假如我们要在c++里干这件事,大概是: 

  1.     map<string, map<string, map<string, string> > > data;
  2.     map<string, map<string, map<string, string> > >::iterator it_1 = data.find("key1");
  3.     if(it_1 != data.end())
  4.     {
  5.         map<string, map<string, string> >::iterator it_2 = it_1->second.find("key2");
  6.         if(it_2 != it_1->second.end())
  7.         {
  8.             map<string, string>::iterator it_3 = it_2->second.find("key3");
  9.             if(it_3 != it_2->second.end())
  10.                 printf("%s\n", it_3->second.c_str());
  11.         }
  12.     }

      光看看就觉得郁闷。

这还仅仅是最简单的情况,如果在key1下还有key2_1key2_2....... 基本上只能跑去定义一堆struct了

噢,杀了我吧,太他妈复杂了。


通过引入jsoncpp库,我们可以这样做:

  1. try
  2. {
  3.         Json::Value data;
  4.         data["key1"]["key2"]["key3"] = "邓小超";
  5.         printf("%s\n", data["key1"]["key2"]["key3"].asCString());
  6. }
  7. catch(...)
  8. {
  9.         printf("some data missed\n");
  10. }


C++居然能使用动态数据类型了!!!这不科学!!!
 

C++的语法虽然要求我们在编译时确定数据类型。但是我们可以用指针指向任意类型的数据,从而避开编译时的检查。例如多态就是利用了虚指针来支持运行时调用不同的子类成员函数。

      更进一步,可以通过指针加类型让c++支持动态数据类型。

  1. class auto_type
  2. {
  3.     void *point;
  4.     int type;
  5. public:
  6.     //各种函数,通过type判断类型,然后处理point指向的数据
  7. }

jsoncpp库利用类似的原理,让我们可以在运行时动态的指定数据类型,相当于让C++支持了动态数据类型。

性能上jsoncpp会比直接使用intstringmapvector要低,但是比起脚本语言还是要高上数倍。

阅读(2951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~