接上篇std::holds_alternative是用于检查类型,不会修改 variant 的内容,而且是用在std::get
之前进行类型检查,以避免抛出异常。
std::get()
是 C++ 标准库中的一个函数,用于从 std::variant
中提取存储的值。它在 C++17 中引入,提供了一种安全的方法来访问 variant
中的特定类型的值。
其实std::get
就是配合std::holds_alternative
一起从 std::variant
中提取存储的值。
1. 语法
#include <variant>
template <typename T, typename... Types>
constexpr T& get(variant<Types...>& v);
template <typename T, typename... Types>
constexpr const T& get(const variant<Types...>& v);
template <std::size_t I, typename... Types>
constexpr std::tuple_element_t<I, std::variant<Types...>>& get(variant<Types...>& v);
template <std::size_t I, typename... Types>
constexpr const std::tuple_element_t<I, std::variant<Types...>>& get(const variant<Types...>& v);
- 参数:
- T: 要提取的类型。
- v: 要访问的 std::variant 对象的引用。
- I: 要提取的类型的索引(0-based)。
- 返回值:
- 返回 variant 中存储的值的引用。如果 variant 中不存储指定类型,将抛出 std::bad_variant_access 异常。
2. 示例
以下是 std::get
的基本用法示例:
#include <variant>
#include <iostream>
#include <string>
int main() {
std::variant<int, std::string> var = "Hello";
// 提取 std::string 类型的值
try {
std::string& str = std::get<std::string>(var);
std::cout << "Variant holds a string: " << str << std::endl;
} catch (const std::bad_variant_access& e) {
std::cout << "Error: " << e.what() << std::endl;
}
// 提取 int 类型的值(会抛出异常)
try {
int& num = std::get<int>(var); // 这里会抛出异常
} catch (const std::bad_variant_access& e) {
std::cout << "Error: " << e.what() << std::endl;
}
return 0;
}
3. 注意事项
在使用 std::get
前,最好先使用 std::holds_alternative
或 std::get_if
检查 variant
中的类型,以避免异常。
std::get
的重载版本还支持通过索引访问 variant
的值。
4. 总结
std::get
是一个强大且灵活的函数,允许开发者安全地从 std::variant
中提取存储的值。正确使用 std::get
可以增强代码的安全性和可读性。