std::variant 是 C++17 标准库中提供的一个类型安全的联合体容器,它能在同一时刻存储多种指定类型中的某一种。在使用该容器时,经常需要判断当前存储的具体数据类型,std::holds_alternative 就是专门用于执行此操作的函数。
- 引入 必要的头文件
在使用前,确保 代码文件中已包含<variant>头文件。如果涉及打印输出,还需包含<iostream>。
#include <variant>
#include <iostream>
#include <string>
- 声明 并初始化
std::variant对象
定义 一个std::variant变量,在尖括号<>中列出所有可能的数据类型。赋值 其中一种类型的值给它。
std::variant<int, double, std::string> myData;
myData = 42; // 当前存储 int 类型
- 使用
std::holds_alternative检查类型
调用std::holds_alternative函数,并在尖括号中指定要检查的目标类型,圆括号中传入 variant 变量名。该函数会返回一个bool值。
bool isInt = std::holds_alternative<int>(myData);
bool isDouble = std::holds_alternative<double>(myData);
- 执行 条件判断逻辑
根据 函数返回的布尔值,编写相应的逻辑分支。例如,打印 当前存储的数据类型信息。
if (std::holds_alternative<int>(myData)) {
std::cout << "当前存储的是 int 类型" << std::endl;
} else if (std::holds_alternative<double>(myData)) {
std::cout << "当前存储的是 double 类型" << std::endl;
} else {
std::cout << "当前存储的是 string 类型" << std::endl;
}
- 注意 编译期的类型约束
std::holds_alternative的第一个模板参数必须是 variant 声明时的类型之一,或者是该类型的 cv-qualified 版本(如const int)。尝试 检查一个不存在的类型会导致编译错误。
// 错误示例:float 不在 variant<int, double, string> 的类型列表中
// bool result = std::holds_alternative<float>(myData); // 编译报错
- 对比 其他获取类型的方法
为了更灵活地处理 variant,了解std::holds_alternative与std::get及std::get_if的区别非常有必要。
| 检查方式 | 返回值类型 | 失败时的行为 | 典型应用场景 |
|---|---|---|---|
std::holds_alternative |
bool |
返回 false |
仅需确认是否存在某种类型,不取值 |
std::get |
目标类型的引用 | 抛出 std::bad_variant_access 异常 |
已确定类型,直接获取值并处理异常 |
std::get_if |
指向目标类型的指针 | 返回 nullptr |
避免异常处理,通过判断指针是否有效来取值 |

暂无评论,快来抢沙发吧!