C++ 库 - <variant>



C++ 中的 <variant> 头文件提供了一种类型安全的联合体,称为 std::variant,它允许我们同时处理多种数据类型。此头文件是通用实用程序库的一部分。std::variant 会跟踪当前持有的类型并确保安全访问。我们可以使用 std::visit 轻松处理包含的类型。

包含 <variant> 头文件

要在 C++ 程序中包含 <variant> 头文件,可以使用以下语法。

#include <variant>

<variant> 头文件的函数

以下是 <variant> 头文件中所有函数的列表。

访问器函数

这些函数允许我们访问和操作包含在 std::variant: 中的值(通常是函数或函数对象)。

序号 函数及描述
1 visit

此函数使用一个或多个变体的参数调用提供的函数对象。

2 holds_alternative

此函数检查变体当前是否持有给定类型。

3 get

此函数读取给定索引或类型(如果类型唯一)的变体的值,在出错时抛出异常。

4 get_if

此函数获取指向给定索引或类型(如果唯一)的指向变体的值的指针,在出错时返回空指针。

访问值

在以下示例中,我们将使用 get 函数访问 varient 对象的值。

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> myVariant = 42; 
    int value = std::get<int>(myVariant);  
    std::cout << "The value is: " << value << std::endl;
    return 0;
}

输出

如果我们运行以上代码,它将生成以下输出:

The value is: 42

比较运算符

序号 函数及描述
1 operator==

此函数检查两个对象是否持有相同的类型,以及它们包含的值是否相等。

2 operator!=

如果两个变体持有不同的类型或其包含的值不相等,则此函数返回 true。

3 operator<=

此函数按字典顺序比较两个对象。如果第一个变体的包含值小于第二个变体的包含值,则返回 true,前提是它们持有相同的类型。

4 operator<=

如果第一个变体小于或等于第二个变体,则此函数返回 true。

5 operator>

此函数检查第一个变体是否大于第二个变体。

6 operator>=

此函数检查第一个变体是否大于或等于第二个变体。

7 operator<=>

此函数/运算符提供两个变体之间的三向比较。

值比较

在以下示例中,我们将使用 opearator== 检查两个对象是否包含相同的值。

#include <iostream>
#include <variant>
int main() {
  std::variant < int, double > variant1 = 42;
  std::variant < int, double > variant2 = 42;

  if (variant1 == variant2) {
    std::cout << "Variants are equal!" << std::endl;
  } else {
    std::cout << "Variants are not equal." << std::endl;
  }
  return 0;
}

输出

以下是上述代码的输出:

Variants are equal!

实用程序函数

序号 函数及描述
1 std::swap

此函数模板专门化了 std::swap 算法。

交换两个变体

在以下示例中,我们将使用 std::swap 交换两个变体的内容。

#include <iostream>
#include <variant>
#include <utility>
int main() {
    std::variant<int, double> v1 = 100, v2 = 3.14;

    std::cout <<"Before: v1 = " << std::get<int>(v1) << ", v2 = " << std::get<double>(v2) << std::endl;
    std::swap(v1, v2);
    std::cout << "After: v1 = " << std::get<double>(v1) << ", v2 = " << std::get<int>(v2) << std::endl;
    return 0;
}

输出

上述代码的输出如下:

Before: v1 = 100, v2 = 3.14
After: v1 = 3.14, v2 = 100
广告