Skip to content

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);