對Boost any的乙個補充

2021-06-02 20:21:25 字數 1490 閱讀 3245

boost::any可以訪問任意型別,是用模板實現的,不過它設計得非常巧妙,其本身不是個模板,而是用乙個模板類的成員來進行資料儲存的,這使得我們可以寫出這樣的**:

boost::any x((std::string(「hello cruel world!」));

x = 123;

x = 3.1416f;

….

但是如何把資料轉變回來呢?

boost::any提供了幾個非成員模板函式any_cast,都需要rtti支援

還有兩個不安全的cast

templateinline valuetype * unsafe_any_cast(any * operand)

templateinline const valuetype * unsafe_any_cast(const any * operand)

不許要rtti支援(注釋中說unsafe_any_cast隨時都有可能被移除)。

所以,boost::any轉換前必須知道它存的是什麼型別才能正確還原資料,這是乙個不足。比如

boost::any x(std::string(「hello cruel world!」));

std::string hello = any_cast(x);

很容易發現還有乙個不足之處就是你每次cast的時候都要寫很長的一串any_cast,與其建構函式簡潔的寫法相比實在不和諧,用過的人一定深有體會。所以我想說的補充就是簡化型別轉化的寫法。其實我們可以再加個操作符使用者自定義型別轉換函式來達到這個目的

在public成員函式那塊加入

templateoperator valuetype()

templateoperator valuetype() const

於是乎

std::string hello = any_cast(x);

可以簡寫成

std::string hello = x;
還有很多,比如

any  a;

a = 163;

int i = a;

a = 2.7182818;

double e = a;

a = 3.1415926f;

float pi = any(3.1416f);

a = string("hello any");

string s = a;

cout<< i <<"\ne="<< e << "\npi="<< pi << "\n" << s << endl;

是不是方便了許多?

附上我提取的any.hpp,加入了文中的補充內容,可以直接用這乙個標頭檔案

話說怎麼傳附件?

關於乙個時間補充的問題

乙個困擾了我兩天的問題,別人乙個小時就搞定了,究其原因是什麼呢,其實就是乙個函式我不知道,但是那個函式真的很常用。問題 一組資料,其中有時間和對應的專案名稱,根據日期進行統計,將沒有資料的對應日期顯示在使用者前端,統計數目記為0?解決此問題的邏輯 使用php在後端解決比使用mysql在sql語句中解...

對乙個問題的解答

今天週日,陪老婆燙完頭髮回到家裡,仍然不忘開啟郵箱,一位朋友問了乙個問題,說想用sysfs實現cdev,我覺得倒是沒有什麼不可,因為sysfs畢竟是乙個核心和使用者空間通訊的介面,是個介面就可以被使用,我之所以敢打這個保票就是因為linux核心只提供機制而不提供任何策略,也就是說,只要你知道乙個機制...

乙個對twilight 的評價

一部廣泛適合各年齡階段女性幻想的沒思想沒邏輯的浪漫濫片!其實就是膚淺的超級英雄類的題材。可貴的是把傳統中的反派角色吸血鬼重新打包套上異能英雄光環。更可貴的是該超級英雄不再為了拯救全人類及地球為己任而戰無不勝,只為心中 唯一 真愛神擋殺神佛礙滅佛!原來吸血鬼做了超級英雄是如此的魅力無敵!比起眾多愛穿緊...