C++ 面试题 目录

C++17 中 std::variant 的用法?

推荐答案

-- -------------------- ---- -------
-------- ----------
-------- ---------
-------- --------

--- ------ -
    ----------------- ------------ --

    - - --- -- - ---- --- ----
    -------------------- ---- -
        --------- -- ------- - -- --- -- ----------
    -- ---

    - - ------- -------- -- - ---- ----------- ----
    -------------------- ---- -
        --------- -- ------- - -- --- -- ----------
    -- ---

    ------ --
-

本题详细解读

std::variant 简介

std::variant 是 C++17 引入的一个模板类,用于表示一个可以持有多种类型值的联合体。与传统的联合体(union)不同,std::variant 是类型安全的,并且可以存储非平凡类型(如 std::string)。

基本用法

  1. 定义 std::variant 对象

    这里定义了一个 std::variant 对象 v,它可以持有 intstd::string 类型的值。

  2. 赋值

    可以通过赋值操作将不同类型的值赋给 std::variant 对象。

  3. 访问值

    使用 std::visit 来访问 std::variant 中的值。std::visit 接受一个可调用对象(如 lambda 表达式)和 std::variant 对象,并根据当前持有的类型调用相应的函数。

其他常用操作

  1. 检查当前持有的类型

    使用 std::holds_alternative 可以检查 std::variant 当前持有的类型。

  2. 获取值

    使用 std::get 可以获取 std::variant 中的值。如果当前持有的类型与请求的类型不匹配,会抛出 std::bad_variant_access 异常。

注意事项

  • std::variant 不能持有引用类型。
  • std::variant 默认情况下会使用第一个类型进行初始化。
  • std::variant 的大小是所有可能类型中最大的类型的大小加上一些额外的开销。
纠错
反馈