zoukankan      html  css  js  c++  java
  • C++中的容器可以同时保存各种数据类型

    [原]C++制作一个泛型容器(可以盛放各种类型的对象)

    2014-5-4阅读494 评论0

    如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好。问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你。

    现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别。这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了。但你想过没有,这些类型盛放的对象总是那么一种,就是vector<T> ,queue<T>,我现在要一种类型可以盛放各种对象,TA,TB,。。。。。怎么办呢

    想来想去我想到了C语言的强制类型装换 TA ta  ;(TB)ta;,这个看起来一般的东东,其实威力无比,他就是C++中的 reinterpret_cast的原型,其功能就是对任意一个内存地址的内容进行重新解释。也就是说,不管你这块内存是什么,我把它强制解释为啥就是啥类型的对象了。

    这样以来,其实我只需要一个string就可以保存任何类型的对象了,不是吗?

    那么vector<string>也就是这种泛型的容器了。那类型放在哪里存放呢?记住朱总说的:规约大于配置,你可以把int类型用(char)1标记、把TA类型用(char)2标记,如此等等,你可以自定义你打算放入容器中的类型的id编号,取的时候只要先判断这个编号就知道里面盛放的是啥类型的对象了。是不是很嗨皮,我不知道有些人是不是不屑,或者说C++已经有了完美的解决方案而我还不知道而已,欢迎批评指正。

    你应该这样将对象放到容器中:

    string string_record(1,1);
    string_record.append(string((char*)&data1,(char*)&data1 + sizeof(e_eledata)));

    你会这么取出你的对象并使用:

    cout<<"type : "<<(int)data_array1[i][0]<<endl;
    cout<<"message : "<<*(e_eledata*)(data_array1[i].c_str()+1)<<endl;
    string s ;
    get_decode((int)data_array1[i][0])->decode(data_array1[i].substr(1,data_array1[i].size()-1),s);

    以上仅仅是抛砖引玉,欢迎各路高手给出更好的方法

    本文的思路来源:感谢同事邱陵给出使用更少或者统一成string类型来表示泛型;感谢陈梵的流处理平台提供了string作为盛放消息数据的数据类型而完成了各种数据的上传和下载;感谢朱总的“规约大于配置”;感谢陈林空工程师给出的整体思路;感谢朱永进对C的执着让我知道字符数组其实可以表示各种类型

  • 相关阅读:
    Wannafly #4 F 线路规划
    PKUWC2018 随机算法
    noip模拟赛
    php 正则判断是否是手机号码 最新
    Onethink上传服务器后登录不了的问题
    【php中的curl】php中curl的详细解说
    50种网站引流量方式
    mysql ERROR 1045 (28000): 错误解决办法
    织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案
    dedecms新增联动类别后的使用方法
  • 原文地址:https://www.cnblogs.com/Erdos001/p/4772606.html
Copyright © 2011-2022 走看看