中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用variant代替union

發布時間:2021-11-10 10:53:35 來源:億速云 閱讀:188 作者:柒染 欄目:大數據

如何使用variant代替union,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

union(聯合體)和struct相似,也可以包含多個數據成員,但是不同的是同時只允許一個成員有效,因此經常作為作為節約空間的類使用。考慮下面的代碼:

    union Uv {        int i;        double df;    };    Uv u1;    u1.i = 100;    std::cout << "u1.i=" << u1.i << std::endl;    std::cout << "u1.df=" << u1.df << std::endl;    u1.df = 122.0;    std::cout << "u1.i=" << u1.i << std::endl;    std::cout << "u1.df=" << u1.df << std::endl;

上述代碼首先聲明了一個包含兩個成員的聯合體,然后分別為兩個成員賦值。為了了解賦值之后每個成員的狀態,在賦值之后又分別將兩個成員的值輸出,其結果如下:

u1.i=100  
u1.df=-9.25596e+61  
u1.i=0  
u1.df=122

u1.i=100u1.df=-9.25596e+61u1.i=0u1.df=122

從結果可以看到,為i賦值之后,i的值有效,而df無效;為df賦值之后,df值有效,而i無效。這件事本身符合union的定義,但問題是如果只是面對一個聯合體的對象,用戶沒有辦法知道那個成員的值是有效的。如果成員是指針或者對象,那么帶來的類型風險會更大。一般的做法是自己實現一個類,另外設置一個管理類型的數據成員,問題是可以解決,但是代價也不小。

這個問題可以使用C++17中引入的variant來解決。直接看代碼:

    std::variant<int, double> var{ 122.0 };    std::cout << var.index() << std::endl;    try {        int i = std::get<int>(var);    }    catch(const std::bad_variant_access & e) {        std::cout << e.what() << std::endl;    }

代碼首先構建了一個包含int和double成員的variant變量,它的名稱為var,初值為double類型的122.0。這里variant會根據初始值的內容自動決定需要初始化那個成員。

初值設定完成之后,可以使用variant提供的index方法獲取當前有效的成員索引。接下來故意在double有效的情況下獲取int成員的值,觀察會發生什么。結果如下:

1122bad variant access

 可以看到獲取double值的處理正常完成,而獲取int值的處理拋出了異常。我們也可以嘗試相反的情況:

  var = 100;  std::cout << var.index() << std::endl;  try {    std::cout << std::get<int>(var) << std::endl;    std::cout << std::get<double>(var) << std::endl;  }  catch (const std::bad_variant_access& e) {    std::cout << e.what() << std::endl;  }

結果如下:

0100bad variant access

這次是獲取int成員成功,獲取double成員時拋出異常。

從這段說明不難看出,有了variant之后,一切都變得簡單又安全。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡| 绍兴县| 柳州市| 岳西县| 青冈县| 临江市| 会泽县| 老河口市| 获嘉县| 奉化市| 中阳县| 库伦旗| 五峰| 定远县| 南郑县| 松江区| 尉犁县| 抚顺县| 九龙坡区| 郑州市| 开江县| 萨迦县| 渭南市| 兴隆县| 泸西县| 扬州市| 五家渠市| 屏东县| 溧阳市| 呼玛县| 邢台县| 洛南县| 广宁县| 仁寿县| 福州市| 温宿县| 增城市| 苍梧县| 漳平市| 林周县| 崇明县|