📅  最后修改于: 2023-12-03 14:50:36.934000             🧑  作者: Mango
在C++编程中,变体(variant)是一种能够保存不同类型值的数据结构。它可以存储多种类型的值,并根据需要进行类型转换和访问。变体的特点是它能够在运行时跟踪其当前所存储的值的类型。
C++17引入了std::variant
模板类,提供了一种类型安全的变体类型。它允许我们在一个变量中存储多个不同的类型,并且可以安全地进行类型转换和访问。变体类似于联合(union),但相对于联合,它提供了更多的类型安全性和更方便的用法。
#include <variant>
#include <iostream>
#include <string>
int main() {
std::variant<int, double, std::string> var;
var = 42; // 存储int类型值
// 获取存储的值,并进行类型判断
if (std::holds_alternative<int>(var)) {
std::cout << "Variant holds int value: " << std::get<int>(var) << std::endl;
} else if (std::holds_alternative<double>(var)) {
std::cout << "Variant holds double value: " << std::get<double>(var) << std::endl;
} else if (std::holds_alternative<std::string>(var)) {
std::cout << "Variant holds string value: " << std::get<std::string>(var) << std::endl;
}
var = 3.14; // 存储double类型值
// 获取存储的值并进行转换
if (std::holds_alternative<double>(var)) {
std::cout << "Variant holds double value: " << std::get<double>(var) << std::endl;
try {
int convertedValue = std::get<int>(var); // 尝试将double转换为int
// 执行到此处说明转换成功
std::cout << "Converted int value: " << convertedValue << std::endl;
} catch (const std::bad_variant_access& e) {
// 转换失败,捕获异常
std::cout << "Failed to convert to int: " << e.what() << std::endl;
}
}
return 0;
}
输出:
Variant holds int value: 42
Variant holds double value: 3.14
Failed to convert to int: std::bad_variant_access
上述示例展示了如何使用std::variant
在一个变量中存储多种类型的值,并进行类型判断和访问。使用std::holds_alternative
可以判断变体当前存储的值的类型。使用std::get
可以获取相应类型的值,同时也支持类型转换。
std::variant
是C++17引入的标准变体模板类,可以在一个变量中存储多个不同类型的值。std::holds_alternative
可以判断变体当前存储的值的类型。std::get
可以获取相应类型的值,并且支持类型转换。更多关于std::variant
的详细信息可以查阅C++标准库的相关文档。