推荐答案
-- -------------------- ---- ------- -------- ---------- -------- --------- -------- -------- --- ------ - ----------------- ------------ -- - - --- -- - ---- --- ---- -------------------- ---- - --------- -- ------- - -- --- -- ---------- -- --- - - ------- -------- -- - ---- ----------- ---- -------------------- ---- - --------- -- ------- - -- --- -- ---------- -- --- ------ -- -
本题详细解读
std::variant 简介
std::variant
是 C++17 引入的一个模板类,用于表示一个可以持有多种类型值的联合体。与传统的联合体(union)不同,std::variant
是类型安全的,并且可以存储非平凡类型(如 std::string
)。
基本用法
定义
std::variant
对象:std::variant<int, std::string> v;
这里定义了一个
std::variant
对象v
,它可以持有int
或std::string
类型的值。赋值:
v = 42; // v 现在持有 int 类型的值 v = "Hello, World!"; // v 现在持有 std::string 类型的值
可以通过赋值操作将不同类型的值赋给
std::variant
对象。访问值:
std::visit([](auto&& arg) { std::cout << "Value: " << arg << std::endl; }, v);
使用
std::visit
来访问std::variant
中的值。std::visit
接受一个可调用对象(如 lambda 表达式)和std::variant
对象,并根据当前持有的类型调用相应的函数。
其他常用操作
检查当前持有的类型:
if (std::holds_alternative<int>(v)) { std::cout << "v holds an int" << std::endl; } else if (std::holds_alternative<std::string>(v)) { std::cout << "v holds a std::string" << std::endl; }
使用
std::holds_alternative
可以检查std::variant
当前持有的类型。获取值:
try { int i = std::get<int>(v); std::cout << "int value: " << i << std::endl; } catch (const std::bad_variant_access& e) { std::cout << "v does not hold an int" << std::endl; }
使用
std::get
可以获取std::variant
中的值。如果当前持有的类型与请求的类型不匹配,会抛出std::bad_variant_access
异常。
注意事项
std::variant
不能持有引用类型。std::variant
默认情况下会使用第一个类型进行初始化。std::variant
的大小是所有可能类型中最大的类型的大小加上一些额外的开销。