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;
}