std::variant


std::variant

C++17增加std::variant實現類似union的功能,但卻比union更高級,variant主要是為了提供更安全的union。舉個例子union里面不能有string這種類型,但std::variant卻可以,還可以支持更多復雜類型,如map等。

std::variant<> 常用操作

操作 說明
index() 返回當前備選項的索引
get () 返回備選項類型為T的值或拋出異常(如果沒有類型為T的值)
get () 返回備選項索引為idx的值或拋出異常(如果沒有索引為idx的值)分配一個新值
get_if () 返回指向類型為T指針或返回nullptr(如果沒有類型為T的值)
get_if () 返回指向索引Idx的指針或nullpt(如果沒有索引為idx的值)
#include <bits/stdc++.h>

using namespace std;

struct A {
    A(int i) {
        a = i;
    }

    int a;
};

int main() {
    
    std::variant<double, std::string, int> var1("hahaha"), var2;
    cout << "var1.index:"<< var1.index() << endl;
    var1 = 123;
    cout << "var1.index:"<< var1.index() << endl;
    var2 = 123.32;
    cout << "var2.index:" << var2.index() << endl;

    try {
        var1 = "xixixi";
        std::string str = std::get<std::string>(var1); // 通過類型獲取值
        var1 = 3;
        int i = std::get<2>(var1); // 通過index獲取對應值
        cout << str << endl;
        cout << i << endl;

    } catch (const std::bad_variant_access& e) {

    }

    //variant的第一個類型一般要有對應的構造函數,否則編譯失敗
    //可以使用std::monostate來打個樁,模擬一個空狀態
//    std::variant<A, double> var3; // 編譯失敗,因為沒有無參構造函數
//    std::variant<A, double> var3{A{2}}; // 編譯成功
    std::variant<std::monostate, A> var3; // 可以編譯成功

    var3 = A{3};
    cout << "var3.index:"<< var3.index() << endl;
    auto a = std::get<A>(var3); // 通過類型獲取值
    cout << "a.a:" << a.a << endl;

    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM