std::get_if用于安全提取std::variant中指定类型值,返回对应类型的指针,若类型不匹配则返回nullptr,使用前必须判空。

std::get_if 用来安全提取 std::variant 中的指定类型值
它不会抛异常,也不强制要求目标类型一定存在——这是和 std::get 最关键的区别。当你不确定 std::variant 当前存的是哪种类型时,必须用 std::get_if,否则可能触发 std::bad_variant_access。
怎么用:传入指针,检查返回值是否非空
std::get_if 接收一个指向 std::variant 的指针(或 const 指针),返回对应类型的指针;如果当前不持有该类型,就返回 nullptr。别直接解引用,先判空。
- 支持两种调用形式:
std::get_if<t>(&v)</t>和std::get_if<i><index></index></i>(&v) - 用类型
T调用更常见,但要注意:若T在 variant 中出现多次(比如std::variant<int long int></int>),编译失败 - 用索引调用可绕过类型歧义,但硬编码索引易错,且不直观
- 返回的是
T*或const T*,不是引用,不能用于修改原值(除非你传的是非常量指针)
常见错误:把 std::get_if 当成 std::get 用
最典型翻车是写成 *std::get_if<int>(&v)</int> 却不检查空指针,一运行就崩。还有人误以为它会自动 fallback 到默认分支,其实它啥也不做,只管“查”。
- 错误现象:
Segmentation fault或未定义行为,尤其在调试器里看不出明显报错 - 错误写法:
int x = *std::get_if<int>(&v); // 危险!没判 nullptr
- 正确写法:
if (auto p = std::get_if<int>(&v)) { int x = *p; // 安全 } - 注意:
std::get_if对std::monostate同样适用,但得显式写std::get_if<:monostate></:monostate>
替代方案对比:std::holds_alternative vs std::get_if
std::holds_alternative<t>(v)</t> 只判断类型是否匹配,不取值;std::get_if 一步到位:既判断又取值。两者性能接近,但少一次查找。
立即学习“C++免费学习笔记(深入)”;
- 如果你只需要判断,用
std::holds_alternative语义更清晰 - 如果你紧接着就要用那个值,用
std::get_if更高效,避免重复类型匹配逻辑 - 不要混用:
if (std::holds_alternative<int>(v)) { auto x = std::get<int>(v); }</int></int>—— 这里std::get仍可能抛异常(并发修改或移动后状态异常时) - 所有这些操作都是 O(1),无运行时开销,但要求编译期能确定类型列表









