C_and_CPP 板


LINE

算半个作业文吧 (?) 不过是写专案的时候碰到的问题 我们有一组Data Access Layer,之前为了让他能方便吃下所有型态 所以Value的部分用boost::variant,如下这样 typedef boost::variant<std::string, int, char*> ValueType; ValueType get(const std::string&& key); void set(const std::string&& key, ValueType value); 然後把它们存在一组map里面 std::map<std::string, ValueType> map; 当然使用上并没有想像中那麽方便啦,这是後话(尤其是get,真的是欧麦尬) 不过看起来也算能用就是了 对於boost::variant使用比较熟的同学应该就知道他能吃三个值了 (本例来讲就是std::string, int, char*) 但是在做serialization的时候,发现boost::serialization对这种case简直无解 std::stringstream ss; boost::archive::text_oarchive ar(ss); ar << map; std::cout << ss.str() << std::endl; 会跑出一大组壮观的错误,当然,身为专业的C++码农,本来就不期待boost无痛搞好 所以就开始自己认命的写serialization了 void SimpleDevDBSpace::serialize(const std::string&& folder) { for(auto i : map) { //Use reference to improve performance const std::string& name = i.first; ValueType& value = i.second; switch(value.which()) { 当然这对大多数人来讲都已经good enough了,但是我总觉得心里痒痒的 value.watch()传回来的是order,也就是0 = string, 1 = int, 2 = char* 但是这不够泛用,如果今天把variant型别改成<int, std::string, float, long> 这样的话还要记得去改value.which的case handle,这显然是有点问题的 所以我的需求是,有没有什麽方法可以让std::string, int, char* 成为一个array 让我需要增加支援type时,改一个地方即可,有点像这样 TypeArray ARR = {std::string, int, char*}; typedef boost::variant<{ARR}> ValueType; 而且这个可以被轮询 我知道value还额外一个提供value.type(),不过我想不出他对我的需求有什麽用 他用了一个很类似loki的Type2Int的方法,但是我找不到公开方法可以去转 有人可以给我一点建议吗?虽然我觉得这需求已经有点龟毛了..... --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.140.192
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1504600853.A.FC2.html
1F:→ Caesar08: any? 09/05 16:49
2F:→ Killercat: any无法限制型别,client爱塞啥就塞啥,会对应到死... 09/05 16:57
3F:→ Killercat: 就是因为要明确定义支援type 所以才用variant的 09/05 17:02
4F:→ PkmX: 用visitor不能吗? 09/05 17:05
5F:→ Killercat: variant是有原生支援visitor没错啦... 恩我研究看看 09/05 17:06
6F:→ Killercat: 反正都要有个地方针对type去handle serialize就是了 09/05 17:07
7F:→ Killercat: 这样的话看能不能印得出「缺某种type的serializer」 09/05 17:07
8F:→ Killercat: 的错误来提醒使用者... 09/05 17:07
9F:→ Killercat: 不过visitor是可以试试 只是写法可能会比较不值观 09/05 17:09
10F:→ Killercat: 附带一提 boost::serialization::variant.hpp是用 09/05 17:09
11F:→ Killercat: visitor没错 只是针对map的话...搞不好可以直接用 09/05 17:09
12F:→ Killercat: 只要自己处理map的部分就好(抓头) 09/05 17:10
14F:→ PkmX: 应该大概类似这样吧 09/05 17:49
15F:→ Killercat: 感谢 让我试试看 //bow 09/05 17:49
17F:→ Killercat: btw, 原来C++17把variant收到std了啊... 09/05 17:53
18F:→ PkmX: 如果要针对不同type handle的话 使用C++17黑魔法 09/05 17:53
19F:→ PkmX: any, optional, variant 都进 C++17 了 09/05 17:54
20F:→ Killercat: 真是个好消息 我看看project能不能支援 XD 09/05 17:59
21F:推 CoNsTaR: 像 idris 的 HVect 一样吗? 09/06 02:53







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP