基本的 stdvariant 使用

這會建立一個可以儲存 intstring 的變體(標記的聯合)。

std::variant< int, std::string > var;

我們可以在其中儲存任何一種型別:

var = "hello"s;

我們可以通過 std::visit 訪問內容:

// Prints "hello\n":
visit( [](auto&& e) {
  std::cout << e << '\n';
}, var );

通過傳入多型 lambda 或類似的函式物件。

如果我們確定我們知道它是什麼型別,我們可以得到它:

auto str = std::get<std::string>(var);

但如果我們弄錯了,這就會丟擲。get_if

auto* str  = std::get_if<std::string>(&var);

如果你猜錯了,就會返回 nullptr

變體保證不動態記憶體分配(除了由其包含的型別分配的動態記憶體分配)。變數中只有一種型別儲存在那裡,並且在極少數情況下(在分配時涉及異常而沒有安全的退出方式)變數可能變空。

變體允許你安全有效地將多個值型別儲存在一個變數中。它們基本上是智慧的,型別安全的 unions。