【C++基础知识——std::get配合std::holds_alternative从`std::variant` 中提取存储的值】

接上篇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 可以增强代码的安全性和可读性。

`std::variant`是C++17引入的一个类模板,它代表了一个可以存储多种类型的类型安全的联合体。`std::variant`的每一类型称为一个“可能类型”。当创建一个`std::variant`实例时,你需要列出所有可能存储的类型,而该实例会存储的一种类型。 在你提到的`std::variant<std::monostate, bool>`,`std::variant`可以存储两种类型的:`std::monostate`和`bool`。`std::monostate`是`std::variant`特有的一个类型,用来表示variant不持有任何的状态。它通常用于表示variant未初始化的情况。 `std::variant`提供了一系列操作来检查当前存储的类型、获取当前存储以及修改存储。使用`std::variant`可以替代C++98的`union`,但是更加安全,因为不需要担心类型混淆和越界问题。 `std::variant`的使用示例可能如下: ```cpp #include <variant> #include <iostream> int main() { std::variant<std::monostate, bool> v; std::cout << std::holds_alternative<std::monostate>(v) << std::endl; // 输出:1,因为variant默认不持有任何 v = true; if (std::holds_alternative<bool>(v)) { std::cout << std::get<bool>(v) << std::endl; // 输出:1 } return 0; } ``` 在上面的代码,我们首先创建了一个`std::variant`实例`v`,默认情况下它不持有任何,即持有`std::monostate`。然后我们给`v`赋予了一个`bool`类型的`true`,并检查当前存储的类型和获取存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值