用C++自寫的Any

     相信大家都很熟悉JAVA的Object類,或多少也知道boost裏的any吧,而小編不才寫了個類似的玩意出來,下面我來說下這個玩意有啥不同和特別之處及實現的原理。

    首先展示Any類型功能:


1.首先肯定是一個Any對象哈,(注意:這個Any不是boost庫的,這是作者寫的哈)

2.其次直接給它賦值一個字符串s,拿出來的時候用泛型轉換後得到該字符串並輸出哈

3.有趣的是它也可以把自己直接拷貝給別人(代碼:string b =s),看圖輸出結果跟最開始給s賦的值相同

4.s =ceshi(55),看到這行不難發現這個Any定義出來的對象是可以被賦值任何對象的,輸出結果如圖所示

5.賜予vector向量Any類型,向量插入數據的時候一樣可以隨便插入各種類型數據

6.其次它的底層數據是使用智能指針unique_ptr實現,所以它可以在給該變量賦值爲空的時候自動釋放被存到裏面new出的空間

下面是基於Any封裝的AnyMap鍵值容器:


其實跟把Any放在vector裏原理一樣都是可放隨意類型,而說到這裏肯定會有個疑問,竟然可以把Any放在vector裏面,爲啥不一樣使用Map,其實這個跟上面說的自動釋放內存一樣,這裏當你刪除一個元素的時候如果該元素是new出來的空間也會自動清楚。

實現原理:


在數字1這裏就是初始化不用講啦,數字2這裏就是根據=號左邊的類型來獲取是否有該值,沒有返回nullptr,數字3是從數據裏獲取到指向無類型的數據,經過在數字2那一步指定類型的轉換返回出去,而這時讀者肯定會有個疑問Any爲什麼可以不需要指定類型可以隨便賦值各種類型數據,其實這就是接下來講的重點。這個類裏邊核心變量數據m_data,也就它一個,它是關鍵。


m_data數據的類


abstacatData有個嵌入類AnyDate,而AnyDate又繼承於abstacatData,從這個嵌入類可以看出這是一個普通的模板類,再回來我們的Any類,它也繼承abstacatData這個父類,所以AnyDate就有操作AnyDate的權限,根據我們Any類裏給m_date賦值看出是new了一個AnyDate對象並根據模板類型存儲數據,而我們m_date是abstacatData類型,是AnyDate的父類,而基類只是一個普通的類,所以可以直接保存創建的AnyDate對象的地址,在Any內部賦值的時候是AnyDate需要泛型,而abstacatData不需要泛型,所以就實現了創建Any對象時不用寫指定類型。AnyMap原理與其一樣,只是在外面利用Map再次幫裝了一遍就不貼出來了哈。

      新人一枚,第一次發表博客,寫的不好忘請見解哈哈!!

點擊下載:源碼鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章