在C++17之前,开发者通常使用boost::variant或自定义的联合体配合std::visit来实现多态容器。随着C++17的标准化,std::variant成为了标准库的一部分,它提供了类型安全、内存占用小且易于使用的多态容器。本文将演示如何使用std::variant创建一个能够存储多种类型的容器,并通过访问器安全地读取和操作其中的值。
1. 基础示例
#include <iostream>
#include <variant>
#include <string>
using VariantType = std::variant<int, double, std::string>;
void printVariant(const VariantType& v) {
std::visit([](auto&& arg) {
std::cout << "value: " << arg << std::endl;
}, v);
}
int main() {
VariantType v1 = 42;
VariantType v2 = 3.14;
VariantType v3 = std::string("hello");
printVariant(v1);
printVariant(v2);
printVariant(v3);
// 修改值
std::get <double>(v2) = 2.718;
printVariant(v2);
}
说明
std::variant只允许构造时指定的类型。std::visit可以对存储的值进行访问,传入一个可调用对象(如 lambda)。- `std::get ` 用于提取当前存储的值,需要确保当前类型匹配,否则抛出 `std::bad_variant_access`。
2. 结合 std::optional 提供默认值
当你不确定 std::variant 是否已经存储了值时,可以将其包裹在 std::optional 中,或者在访问前使用 `std::holds_alternative