在现代 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。