std::variant 是 C++17 中引入的一个模板类,它可以表示多个可能的类型。std::variant 的使用方法非常简单,它可以用于任何类型,包括内置类型、自定义类型和 STL 容器等。
std::variant<Ts...>:表示多个可能的类型Ts...。std::get<N>(std::variant<Ts...>&):获取std::variant<Ts...>中的第N个类型的值,如果类型不匹配则抛出异常。std::get_if<N>(std::variant<Ts...>*):获取std::variant<Ts...>中的第N个类型的指针,如果类型不匹配则返回nullptr。std::variant<Ts...>::index():获取std::variant<Ts...>中当前值的类型索引。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 是一个非常实用的模板类,它可以帮助我们处理多个可能的类型,避免手动使用枚举或联合体。但是,由于它可能会导致类型不匹配或异常,因此在使用时需要格外小心,避免出现不必要的错误。
No comments yet.