
- C 標準庫
- C 標準庫
- C++ 標準庫
- C++ 庫 - 首頁
- C++ 庫 - <fstream>
- C++ 庫 - <iomanip>
- C++ 庫 - <ios>
- C++ 庫 - <iosfwd>
- C++ 庫 - <iostream>
- C++ 庫 - <istream>
- C++ 庫 - <ostream>
- C++ 庫 - <sstream>
- C++ 庫 - <streambuf>
- C++ 庫 - <atomic>
- C++ 庫 - <complex>
- C++ 庫 - <exception>
- C++ 庫 - <functional>
- C++ 庫 - <limits>
- C++ 庫 - <locale>
- C++ 庫 - <memory>
- C++ 庫 - <new>
- C++ 庫 - <numeric>
- C++ 庫 - <regex>
- C++ 庫 - <stdexcept>
- C++ 庫 - <string>
- C++ 庫 - <thread>
- C++ 庫 - <tuple>
- C++ 庫 - <typeinfo>
- C++ 庫 - <utility>
- C++ 庫 - <valarray>
- C++ STL 庫
- C++ 庫 - <array>
- C++ 庫 - <bitset>
- C++ 庫 - <deque>
- C++ 庫 - <forward_list>
- C++ 庫 - <list>
- C++ 庫 - <map>
- C++ 庫 - <multimap>
- C++ 庫 - <queue>
- C++ 庫 - <priority_queue>
- C++ 庫 - <set>
- C++ 庫 - <stack>
- C++ 庫 - <unordered_map>
- C++ 庫 - <unordered_set>
- C++ 庫 - <vector>
- C++ 庫 - <algorithm>
- C++ 庫 - <iterator>
- C++ 高階庫
- C++ 庫 - <any>
- C++ 庫 - <barrier>
- C++ 庫 - <bit>
- C++ 庫 - <chrono>
- C++ 庫 - <cinttypes>
- C++ 庫 - <clocale>
- C++ 庫 - <condition_variable>
- C++ 庫 - <coroutine>
- C++ 庫 - <cstdlib>
- C++ 庫 - <cstring>
- C++ 庫 - <cuchar>
- C++ 庫 - <charconv>
- C++ 庫 - <cfenv>
- C++ 庫 - <cmath>
- C++ 庫 - <ccomplex>
- C++ 庫 - <expected>
- C++ 庫 - <format>
- C++ 庫 - <future>
- C++ 庫 - <flat_set>
- C++ 庫 - <flat_map>
- C++ 庫 - <filesystem>
- C++ 庫 - <generator>
- C++ 庫 - <initializer_list>
- C++ 庫 - <latch>
- C++ 庫 - <memory_resource>
- C++ 庫 - <mutex>
- C++ 庫 - <mdspan>
- C++ 庫 - <optional>
- C++ 庫 - <print>
- C++ 庫 - <ratio>
- C++ 庫 - <scoped_allocator>
- C++ 庫 - <semaphore>
- C++ 庫 - <source_location>
- C++ 庫 - <span>
- C++ 庫 - <spanstream>
- C++ 庫 - <stacktrace>
- C++ 庫 - <stop_token>
- C++ 庫 - <syncstream>
- C++ 庫 - <system_error>
- C++ 庫 - <string_view>
- C++ 庫 - <stdatomic>
- C++ 庫 - <variant>
- C++ STL 庫速查表
- C++ STL - 速查表
- C++ 程式設計資源
- C++ 程式設計教程
- C++ 有用資源
- C++ 討論
C++ 庫 - <variant>
C++ 中的 <variant> 標頭檔案提供了一種型別安全的聯合體,稱為 std::variant,它允許我們同時處理多種資料型別。此標頭檔案是通用實用程式庫的一部分。std::variant 會跟蹤當前持有的型別並確保安全訪問。我們可以使用 std::visit 輕鬆處理包含的型別。
包含 <variant> 標頭檔案
要在 C++ 程式中包含 <variant> 標頭檔案,可以使用以下語法。
#include <variant>
<variant> 標頭檔案的函式
以下是 <variant> 標頭檔案中所有函式的列表。
訪問器函式
這些函式允許我們訪問和操作包含在 std::variant: 中的值(通常是函式或函式物件)。
序號 | 函式及描述 |
---|---|
1 | visit
此函式使用一個或多個變體的引數呼叫提供的函式物件。 |
2 | holds_alternative
此函式檢查變體當前是否持有給定型別。 |
3 | get
此函式讀取給定索引或型別(如果型別唯一)的變體的值,在出錯時丟擲異常。 |
4 | get_if
此函式獲取指向給定索引或型別(如果唯一)的指向變體的值的指標,在出錯時返回空指標。 |
訪問值
在以下示例中,我們將使用 get 函式訪問 varient 物件的值。
#include <iostream> #include <variant> int main() { std::variant<int, double> myVariant = 42; int value = std::get<int>(myVariant); std::cout << "The value is: " << value << std::endl; return 0; }
輸出
如果我們執行以上程式碼,它將生成以下輸出:
The value is: 42
比較運算子
序號 | 函式及描述 |
---|---|
1 | operator==
此函式檢查兩個物件是否持有相同的型別,以及它們包含的值是否相等。 |
2 | operator!=
如果兩個變體持有不同的型別或其包含的值不相等,則此函式返回 true。 |
3 | operator<=
此函式按字典順序比較兩個物件。如果第一個變體的包含值小於第二個變體的包含值,則返回 true,前提是它們持有相同的型別。 |
4 | operator<=
如果第一個變體小於或等於第二個變體,則此函式返回 true。 |
5 | operator>
此函式檢查第一個變體是否大於第二個變體。 |
6 | operator>=
此函式檢查第一個變體是否大於或等於第二個變體。 |
7 | operator<=>
此函式/運算子提供兩個變體之間的三向比較。 |
值比較
在以下示例中,我們將使用 opearator== 檢查兩個物件是否包含相同的值。
#include <iostream> #include <variant> int main() { std::variant < int, double > variant1 = 42; std::variant < int, double > variant2 = 42; if (variant1 == variant2) { std::cout << "Variants are equal!" << std::endl; } else { std::cout << "Variants are not equal." << std::endl; } return 0; }
輸出
以下是上述程式碼的輸出:
Variants are equal!
實用程式函式
序號 | 函式及描述 |
---|---|
1 | std::swap
此函式模板專門化了 std::swap 演算法。 |
交換兩個變體
在以下示例中,我們將使用 std::swap 交換兩個變體的內容。
#include <iostream> #include <variant> #include <utility> int main() { std::variant<int, double> v1 = 100, v2 = 3.14; std::cout <<"Before: v1 = " << std::get<int>(v1) << ", v2 = " << std::get<double>(v2) << std::endl; std::swap(v1, v2); std::cout << "After: v1 = " << std::get<double>(v1) << ", v2 = " << std::get<int>(v2) << std::endl; return 0; }
輸出
上述程式碼的輸出如下:
Before: v1 = 100, v2 = 3.14 After: v1 = 3.14, v2 = 100