variant的获取std::get(var);
遇到的问题:做一个log收集器,使用variant做map,完成后将map顺序使用std::cout打印出来。
我们都知道std::cout可以不传类型自动判断类型,为什么到variant就不行了,创建variant的时候已经包含类型信息了,获取的时候为什么还要传int这个类型呢,这个功能就无法做通用打印,必须使用is_same_v<T,int>判断然后传入类型吗?
![](https://profile-avatar.csdnimg.cn/cfae0d207cc746068ca9b2a19b42022f_stophin.jpg!4)
vatiant获取数据的时候必须传类型的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
在C++中,
std::variant
是一个非常灵活的数据容器,它可以存储任意数量的不同类型的值,但在访问这些值时,确实需要提供一个类型作为模板参数给std::get
函数,这是因为编译时期需要知道要提取哪种类型的值。这是为了确保类型安全,防止意外地从错误的类型中获取数据。然而,如果你想实现一个通用的打印逻辑,可以在运行时确定类型并处理不同情况。下面是一个简单的例子,展示了如何创建一个模板函数来处理这种情况:
#include <iostream> #include <variant> #include <string> #include <map> // 定义一个打印模板函数 template <typename T> void print_value(T const& value) { std::cout << value << '\n'; } // 用于处理std::variant的函数 template <typename VariantType, typename... Args> void print_variant(VariantType const& variant, Args&&... args) { if constexpr (std::holds_alternative<int>(variant)) { print_value(std::get<int>(variant)); } else if constexpr (std::holds_alternative<std::string>(variant)) { print_value(std::get<std::string>(variant)); } // 添加更多可能的类型... else { throw std::runtime_error("Unsupported type in variant"); } } int main() { std::map<std::string, std::variant<int, std::string>> log_map = { {"Entry1", 42}, {"Entry2", "Hello, World!"}, }; for (const auto& entry : log_map) { std::cout << "Key: " << entry.first << ", Value: "; print_variant(entry.second); } return 0; }
在这个示例中,我们定义了一个模板函数
print_value
来打印不同类型的数据,以及一个名为print_variant
的辅助函数,它根据给定的std::variant
中的实际类型调用适当的print_value
。这样,你可以为不同的类型添加更多的条件分支,而不需要提前知道具体的键值对中的类型。注意,这个例子仅适用于你知道可能会有哪些类型的情况。如果你的程序需要处理完全未知的类型集合,你可能需要考虑其他设计,例如使用某种形式的反射或者动态类型系统。然而,在标准C++中,并没有内置的反射机制。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥20 gitlab 中文路径,无法下载
- ¥15 用动态规划算法均分纸牌
- ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据
- ¥15 关于树的路径求解问题
- ¥15 yolo在训练时候出现File "D:\yolo\yolov5-7.0\train.py"line 638,in <module>
- ¥30 戴尔inspiron独显直连
- ¥15 进行一项代码设计遇到问题
- ¥15 Mutisim中关于74LS192N计数器芯片设计(计数器)
- ¥50 fastadmin后台无法删除文件
- ¥15 oracle查询Socket read timed out错误