std中的variant
cpp
std::variant<int,double>my_variant;
int main()
{
my_variant=3.14;
if constexpr(std::is_same_v<decltype(my_variant),double>)
{
std::cout<<"my_variant holds a double\n";
}
else
{
std::cout<<"my_variant holds an int\n";
}
//上面这行代码输出的还是hold an int,这是因为`decltype(my_variant)`获取的是变量`my_variant`的声明类型,而不是它当前存储的值的类型。如果`my_variant`不是直接声明为`double`类型,那么`std::is_same_v<decltype(my_variant), double>`的结果将是`false`,因此会执行`else`分支的代码。
if (std::holds_alternative<int>(my_variant))//不能使用constexpr,因为需要运行时才能确定类型.
{
std::cout<<"my_variant holds an int\n";
}
else
{
std::cout<<"my_variant holds a double\n";
}
}
std::visit
是一个非常有用的函数,它允许你以类型安全的方式访问std::variant
中的内容。你可以传递一个泛型 lambda 或一个std::variant
访问器对象,它将被调用在当前活跃类型的实例上。
cpp
std::visit([=](auto && args){
std::cout<<"The value of my_variant is "<<args<<'\n';
},my_variant);