std::variant
是 C++17 引入的一个类型安全的联合体(union)。它允许你在同一个内存位置存储不同类型的值,但在任何给定时间只能存储其中一种类型的值。使用初始化列表来初始化 std::variant
可以使代码更加简洁和直观。
std::variant
是一个模板类,可以存储多种类型中的一种。初始化列表(initializer list)是一种在构造函数中使用花括号 {}
来初始化对象的方式。
使用初始化列表初始化 std::variant
的优势包括:
std::variant
提供了类型安全的联合体,避免了传统联合体可能带来的类型错误。std::variant
是一个模板类,可以接受多个类型作为模板参数。例如:
std::variant<int, double, std::string> v;
std::variant
适用于需要在不同类型之间切换的场景,例如:
以下是一个使用初始化列表初始化 std::variant
的示例:
#include <iostream>
#include <variant>
#include <string>
int main() {
// 使用初始化列表初始化 std::variant
std::variant<int, double, std::string> v = 42;
// 访问 variant 中的值
if (std::holds_alternative<int>(v)) {
std::cout << "Variant holds an int: " << std::get<int>(v) << std::endl;
} else if (std::holds_alternative<double>(v)) {
std::cout << "Variant holds a double: " << std::get<double>(v) << std::endl;
} else if (std::holds_alternative<std::string>(v)) {
std::cout << "Variant holds a string: " << std::get<std::string>(v) << std::endl;
}
return 0;
}
std::get
会抛出 std::bad_variant_access
异常?原因:当尝试访问 std::variant
中不存在的类型时,std::get
会抛出 std::bad_variant_access
异常。
解决方法:在使用 std::get
之前,先使用 std::holds_alternative
检查 std::variant
中是否包含所需的类型。
if (std::holds_alternative<int>(v)) {
std::cout << "Variant holds an int: " << std::get<int>(v) << std::endl;
} else {
std::cout << "Variant does not hold an int." << std::endl;
}
通过这种方式,可以避免在访问 std::variant
时抛出异常。
领取专属 10元无门槛券
手把手带您无忧上云