VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1117|回复: 1

[交流] 最愛的boost容器之 any

[复制链接]
74_avatar_middle
在线会员 发表于 2015-9-3 19:44:27 | 显示全部楼层 |阅读模式
本帖最后由 zuiwuchang 于 2015-9-3 19:47 编辑

這個板塊 依然是這麼人丁單薄 就讓我 繼續 閒暇時 來胡謅幾句 以添加點生氣吧

正文
c++98 提供了 幾個容器(沒記錯的話有8個標準容器 和3/4個 其他容器) 自從 玩了後 基本就沒自定義過數據結構了
boost亦提供了 幾個 c++ std中沒有的 容器 其中 any 算是我的最愛之一

c++是一種強型別的語言 和lua js bash shell(其它沒玩過就不提了)... 相比 要嚴謹許多 在很多方面這是有益的 然 事物總是有得有失 偶爾亦會顯得 麻煩
any 可以在必要的時候 使c++ 獲得 弱型別語言的 一些便利
從上面的描述 你可以猜測到 any 是一個 boost提供的容器 其可以 儲存 任意的 型別 以使c++享受 弱型別語言的 某些便利



現在來試想一種 情況 你有一個 數據對象用來保存一些 數據 具體一點(以鄙人之前遇到的 一個情況為例) 你寫了一個日誌記錄系統 現在 有一個 數據對象 用來保存 記錄配置 如是否使用 gzip 單文件大小 日期格式 ...
在 lua中 你會這麼寫
  1. local cnf = {}
  2. cnf.gzip = true
  3. cnf.fotmat = "1911-10-10"
  4. cnf.maxsize = 1024
复制代码
現在 cnf 是一個 table 或者說 key/value 鍵值隊 操作 書寫都很方便

但如果 用c++實現 就麻煩了 實現 cnf是一個key/value 的鍵值隊 這很容易 用 std::map<k,v> 就行
cnf 元素的 value 不是同等 型別 這時 map就無能為力了 map 中v 的 型別在map定義時 就必須 指定 而且 只能是一種
而cnf 的gizp是 bool format是 string maxsize是 std::size_t

當然 玩慣了 派生的人 大可以 實現一個 base 基類 然後 由 基類派生 三個 子類 分別 代表 gzip format maxsize
之後 使用 std::map<k,base*>
這自然是可以 然 卻 顯得 麻煩至極 此時 正是 使用 any 來享受 弱型別的 便利之時
any 重載了 operator = 可以將帶有copy語義的 對象 儲存其內部
之後 使用
boost::any_cast<T>(any)boost::any_cast<T&>(any)
返回其 副本 或 引用
(boost的智能指針 大多帶 copy語義故可以和any一起使用 沒記錯的話只有 scoped_ptr 不帶copy語義
因為 scoped_ptr 只是一個本地 指針 本來就是只用於 當前上下文 故 boost 似乎是將其 operator=等定義為了private(如果沒記錯的話))
現在 c++版本的 代碼就像下面
  1. std::map<std::string,boost::any> cnf;
  2.     cnf["gzip"] = true;
  3.     cnf["format"] = std::string("1911-10-10");
  4.     cnf["maxsize"] = std::size_t(1024);


  5.    std::cout<<boost::any_cast<bool>(cnf["gzip"])<<"\n"
  6.              <<boost::any_cast<std::string>(cnf["format"])<<"\n"
  7.              <<boost::any_cast<std::size_t>(cnf["maxsize"])<<"\n"
  8.               ;
复制代码





注意
any 是不能儲存 c字符串的 因為 any 是用於存儲一個型別 而 c字符串是一個 數組(char型別集合)
any 可以很好的支持 boost的 智能指針 也就是說 你可以 使用 any操作 shared_ptr(包括其他 可以轉移控制權限的 智能指針) 同時 享受 shared_ptr 的自動內存服務





评分

参与人数 1驿站币 +3 热心值 +3 收起 理由
51_avatar_small Syc + 3 + 3 很给力!

查看全部评分





上一篇:Win7-X64系统下VC获得进程路径信息
下一篇:关于BOOL和bool
51_avatar_middle
online_admins 发表于 2015-9-5 20:56:07 | 显示全部楼层
多谢楼主分享,好文,boost 还是非常不错的东东,大家有时间一定要好好研究研究
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-25 13:02

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表