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/m.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燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP