何时用std::variant, 何时用std::any 两者异同和使用场景
时间: 2023-08-01 12:13:18 浏览: 165
variant_access:https:docs.rsvariant_access_traits
`std::variant` 和 `std::any` 都是 C++17 引入的类型安全的 C++ 标准库工具,用于处理类型不确定的情况。它们的不同点在于,`std::variant` 是一个有限制的联合类型,只能存储指定的几种类型,而 `std::any` 则可以存储任意类型的值。
`std::variant` 的使用场景一般是在需要存储一组有限类型的值时,例如一个变量可以是 `int`、`double` 或 `std::string` 类型。`std::variant` 可以通过指定类型列表来定义一个联合类型,该联合类型只能存储指定类型列表中的类型。`std::variant` 的优点是可以提供类型安全的访问,避免了访问错误类型的问题。
以下是一个示例代码:
```c++
#include <iostream>
#include <variant>
int main() {
std::variant<int, double, std::string> var = 123;
std::cout << std::get<int>(var) << std::endl; // 输出 123
var = 3.14;
std::cout << std::get<double>(var) << std::endl; // 输出 3.14
var = "hello";
std::cout << std::get<std::string>(var) << std::endl; // 输出 "hello"
// 以下代码会抛出 std::bad_variant_access 异常,因为 var 中存储的不是 int 类型
// std::cout << std::get<int>(var) << std::endl;
return 0;
}
```
`std::any` 的使用场景一般是在需要存储任意类型的值时,例如一个变量可以是任意类型的对象。`std::any` 可以存储任意类型的值,并提供了类型安全的访问,但是需要使用 `std::any_cast` 函数来获取存储的值。
以下是一个示例代码:
```c++
#include <iostream>
#include <any>
int main() {
std::any var = 123;
std::cout << std::any_cast<int>(var) << std::endl; // 输出 123
var = 3.14;
std::cout << std::any_cast<double>(var) << std::endl; // 输出 3.14
var = "hello";
std::cout << std::any_cast<const char*>(var) << std::endl; // 输出 "hello"
// 以下代码会抛出 std::bad_any_cast 异常,因为 var 中存储的不是 int 类型
// std::cout << std::any_cast<int>(var) << std::endl;
return 0;
}
```
综上所述,当需要存储一组有限类型的值时,可以使用 `std::variant`;当需要存储任意类型的值时,可以使用 `std::any`。
阅读全文