std::variant 是 C++17 中引入的一个模板类,它可以表示多个可能的类型。std::variant 的使用方法非常简单,它可以用于任何类型,包括内置类型、自定义类型和 STL 容器等。

  1. std::variant<Ts...>:表示多个可能的类型 Ts...。
  2. std::get<N>(std::variant<Ts...>&):获取 std::variant<Ts...> 中的第 N 个类型的值,如果类型不匹配则抛出异常。
  3. std::get_if<N>(std::variant<Ts...>*):获取 std::variant<Ts...> 中的第 N 个类型的指针,如果类型不匹配则返回 nullptr。
  4. std::variant<Ts...>::index():获取 std::variant<Ts...> 中当前值的类型索引。
  5. std::variant<Ts...>::valueless_by_exception():判断 std::variant<Ts...> 是否存在值。

以下是一个使用 std::variant 的示例代码:

#include <iostream>
#include <variant>

int main() {
    std::variant<int, double, std::string> v;

    v = 10;
    std::cout << std::get<int>(v) << std::endl;

    v = 3.14;
    std::cout << std::get<double>(v) << std::endl;

    v = "hello";
    std::cout << std::get<std::string>(v) << std::endl;

    if (auto p = std::get_if<int>(&v)) {
        std::cout << "The value is " << *p << std::endl;
    } else if (auto p = std::get_if<double>(&v)) {
        std::cout << "The value is " << *p << std::endl;
    } else if (auto p = std::get_if<std::string>(&v)) {
        std::cout << "The value is " << *p << std::endl;
    }

    return 0;
}

在这个示例代码中,我们定义了一个名为 v 的 std::variant 对象,它可以存储 int、double 和 std::string 三种类型的值。然后,我们分别将 v 赋值为 10、3.14 和 "hello",并使用 std::get 函数获取 v 中的值。接着,我们使用 std::get_if 函数获取 v 中的值的指针,并根据指针的类型输出不同的信息。

总之,std::variant 是一个非常实用的模板类,它可以帮助我们处理多个可能的类型,避免手动使用枚举或联合体。但是,由于它可能会导致类型不匹配或异常,因此在使用时需要格外小心,避免出现不必要的错误。