1、介绍:
std::variant
是 C++17 引入的一个类型安全的联合体,它允许一个变量在不同的时间存储不同类型的值。其提供了类型安全性,确保每次只有一个类型的值被存储,并且可以在运行时检查和访问存储的类型
std::variant<T, T, T...> v;
2、访问:
std::get<int> (v); //获取存储的整数值
直接用get获取不能保证v里的数据类型为int,若为其他类型则会报异常!
std::get_if<int> (&v) //如果类型不匹配,返回一个空指针(nullptr),避免抛出异常
if ( auto p = get_if<int> (&v) ){cout << *p << endl;
}
4、判断存储类型:
std::holds_alternative<T> (v) //检查是否为T类型
5、运行代码:
#include <variant>
#include <iostream>
int main()
{
std::variant<int, double, std::string> v;
v = 42; // 存储一个整数
std::cout << std::get<int>(v) << std::endl; // 获取整数
v = 3.14; // 存储一个浮点数
std::cout << std::get<double>(v) << std::endl; // 获取浮点数
v = "Hello, variant!"; // 存储一个字符串
std::cout << std::get<std::string>(v) << std::endl; // 获取字符串
if (auto p = std::get_if<int>(&v)) { //当前类型为 string, 故 p 为 nullptr
std::cout << *p << std::endl;
}
if (auto p = std::get_if<std::string>(&v)) {
std::cout << *p << std::endl; // 打印 "Hello, variant!"
}
if (std::holds_alternative<int>(v)) {
std::cout << "v 类型为 int!" << std::endl;
}
if (std::holds_alternative<std::string>(v)) {
std::cout << "v 类型为 string!" << std::endl;
}
return 0;
}
6、运行结果:
7、配合 std::visit 使用
std::visit 是一个模板函数,它允许为 variant 中的每种类型提供一个处理函数,它会自动调用对应的处理函数,其会根据 v 当前存储的类型选择合适的lambda函数进行调用。
std::visit ( 函数对象 , v);
lambda函数:
#include <variant>
#include <iostream>
int main()
{
std::variant<int, double, std::string> v;
v = 42;
std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);
v = 3.14;
std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);
v = "Hello, variant!";
std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);
return 0;
}
42
3.14
Hello, variant!
重载函数:
#include <variant>
#include <iostream>
struct Visitor {
void operator()(int i) const {
std::cout << "Integer: " << i << std::endl;
}
void operator()(double d) const {
std::cout << "Double: " << d << std::endl;
}
void operator()(const std::string& s) const {
std::cout << "String: " << s << std::endl;
}
};
int main()
{
std::variant<int, double, std::string> v;
v = 42;
std::visit(Visitor(), v);
v = 3.14;
std::visit(Visitor(), v);
v = "Hello, variant!";
std::visit(Visitor(), v);
return 0;
}
Integer: 42
Double: 3.14
String: Hello, variant!