如何将Qt QVariantMap移植到STL C++并无类型访问variant值?
解决STL异构容器中无类型访问variant值的问题
要在不知道std::variant具体存储类型的情况下访问其值,核心方法是使用C++17提供的**std::visit**——它会根据variant当前持有的类型,自动匹配并执行对应的处理逻辑,完美适配异构容器的场景。
方法1:泛型Lambda快速处理(适合简单统一操作)
如果只是需要对所有类型执行通用操作(比如输出),直接用泛型Lambda配合std::visit即可:
#include <iostream> #include <map> #include <variant> #include <string> int main() { std::map<std::string, std::variant<int, std::string>> my_map; my_map.insert({"ab", 7676}); my_map.insert({"cd", "stringval"}); for (const auto& pair : my_map) { // 自动匹配variant中的类型并执行输出 std::visit([](const auto& val) { std::cout << pair.first << ": " << val << std::endl; }, pair.second); } return 0; }
方法2:重载函数对象(适合差异化类型处理)
如果需要针对不同类型做定制化操作,可以定义一个重载了operator()的结构体作为访问器:
#include <iostream> #include <map> #include <variant> #include <string> // 自定义访问器,针对不同类型实现不同逻辑 struct VariantHandler { void operator()(int val) const { std::cout << "[整数类型] " << val << std::endl; } void operator()(const std::string& val) const { std::cout << "[字符串类型] " << val << std::endl; } }; int main() { std::map<std::string, std::variant<int, std::string>> my_map; my_map.insert({"ab", 7676}); my_map.insert({"cd", "stringval"}); for (const auto& pair : my_map) { std::visit(VariantHandler{}, pair.second); } return 0; }
关键说明
std::visit会在编译期生成对应类型的处理分支,运行时自动匹配当前variant存储的类型,无需手动判断。- 若后续扩展
variant的类型列表(比如新增double),只需在访问器中添加对应重载即可,扩展性极强。 - 这种方案完全替代了Qt中
QVariant的toInt()、toString()等类型转换方法,是STL处理异构容器的标准实现。
内容的提问来源于stack exchange,提问作者Sirisha
相关产品推荐
相关产品推荐

