在現代 C++ 編程世界中,std::variant 是一個強大的工具,它允許您以靈活且類型安全的方式處理多種數據類型。在本文中,我們將討論 std::variant 並通過實際代碼示例探討其基礎知識、應用程序和優點。
先決條件:C++ 數據類型、函數、聯合和類。
什麽是 std::variant?
變體是 C++ 17 中引入的一種數據類型,可以保存不同類型的值,很像 C 中的聯合。但是,std::variant 為表帶來了類型安全性,使其成為更安全、更通用的替代方案。
std::Variant 如何工作?
從本質上講,std::variant 是類型的聯合。它可以一次存儲一組預定義類型中的一個值。與傳統的聯合不同,std::variant 跟蹤其活動類型,確保您訪問正確的值。
std::Variant 支持的類型
std::variant 可以保存各種數據類型的值,包括基本類型(int、double 等)、用戶定義類型(自定義類或結構),甚至其他變體。這種靈活性為處理複雜數據場景開辟了無限可能。
std::variant 的語法
std::variant <Types...> var_name;
其中,
- Types: 變體可能必須存儲的所有可能的數據類型。
- var_name:變體對象名稱。
與 std::variant 相關的方法
與 std::variant 關聯的一些方法可提供不同的函數。其中一些如下:
S.No |
Method |
Description |
---|---|---|
1 |
index() | 返回存儲在變體中的數據類型的索引。 |
2 |
emplace() | 就地構建變體的值。 |
3 |
holds_alternative() | 檢查給定類型的數據是否在給定時刻存儲在變體中。 |
4 |
get() | 它從變體中檢索給定類型或索引的值。 |
std::variant 的示例
讓我們用一些代碼示例來說明 std::variant。
示例 1
C++
// C++ Program to illustrate std::variant
#include <iostream>
#include <string>
#include <variant>
using namespace std;
int main()
{
variant<int, double, string> myVariant;
myVariant = 42; // Assign an int
// Access the int
if (holds_alternative<int>(myVariant)) {
cout << get<int>(myVariant) << endl;
}
myVariant = 3.14; // Assign a double
// Access the double
if (holds_alternative<double>(myVariant)) {
cout << get<double>(myVariant) << endl;
}
myVariant = "Hello, Variant!"; // Assign a string
// Access the string
if (holds_alternative<string>(myVariant)) {
cout << get<string>(myVariant) << endl;
}
return 0;
}
輸出
42 3.14 Hello, Variant!
示例 2
C++
// C++ Program to illustrate std::variant
#include <iostream>
#include <variant>
using namespace std;
// Define custom data types
struct Circle {
double radius;
};
struct Square {
double side;
};
// driver code
int main()
{
variant<Circle, Square> shapeVariant;
// Create a Circle
shapeVariant = Circle{ 5.0 };
// Check the active type and perform operations
// accordingly
if (holds_alternative<Circle>(shapeVariant)) {
Circle c = get<Circle>(shapeVariant);
cout << "Circle with radius: " << c.radius << endl;
}
else if (holds_alternative<Square>(shapeVariant)) {
Square s = get<Square>(shapeVariant);
cout << "Square with side: " << s.side << endl;
}
else {
// Handle the case where the variant does not
// contain either a Circle or a Square
cout << "Unrecognized shape" << endl;
}
return 0;
}
輸出
Circle with radius: 5
std::Variant 的應用
以下是 std::variant 的一些主要應用:
- 處理多種數據類型:std::variant 最常見的用例之一是當您需要使用可以接受不同數據類型的函數或類時。您可以使用變體來簡化代碼並使其更易於維護,而不是編寫多個重載。
- 狀態機:狀態機是軟件工程中的一個重要概念,通常需要管理不同的狀態和轉換。 std::variant 允許您將狀態表示為類型並將轉換表示為函數,從而簡化了這一點,從而產生幹淨高效的代碼。
相關用法
- C++17 std::clamp用法及代碼示例
- C++17 std::lcm用法及代碼示例
- C++17 std::cyl_bessel_i用法及代碼示例
- C++11 std::initializer_list用法及代碼示例
- C++11 std::move_iterator用法及代碼示例
- C++14 std::integer_sequence用法及代碼示例
- C++14 std::quoted用法及代碼示例
- C++14 std::make_unique用法及代碼示例
- C++ cos()用法及代碼示例
- C++ sin()用法及代碼示例
- C++ asin()用法及代碼示例
- C++ atan()用法及代碼示例
- C++ atan2()用法及代碼示例
- C++ acos()用法及代碼示例
- C++ tan()用法及代碼示例
- C++ sinh()用法及代碼示例
- C++ ceil()用法及代碼示例
- C++ tanh()用法及代碼示例
- C++ fmod()用法及代碼示例
- C++ acosh()用法及代碼示例
- C++ asinh()用法及代碼示例
- C++ floor()用法及代碼示例
- C++ atanh()用法及代碼示例
- C++ log()用法及代碼示例
- C++ trunc()用法及代碼示例
注:本文由純淨天空篩選整理自jarvis08大神的英文原創作品 std::variant in C++ 17。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。