推荐答案
// www.javascriptcn.com code example
#include <iostream>
#include <variant>
#include <string>
int main() {
std::variant<int, std::string> v;
v = 42; // v 现在持有 int 类型的值
std::visit([](auto&& arg) {
std::cout << "Value: " << arg << std::endl;
}, v);
v = "Hello, World!"; // v 现在持有 std::string 类型的值
std::visit([](auto&& arg) {
std::cout << "Value: " << arg << std::endl;
}, v);
return 0;
}本题详细解读
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的大小是所有可能类型中最大的类型的大小加上一些额外的开销。