多类型标准映射
Multitype stl map
最近我开始使用这个JSON库。它有一个很好的方法,允许获取任何类型的数据,并且值将在返回时自动转换,例如:
使用以下 JSON 时:
{
"name": "Stackoverflow",
"integer": 1234,
"precise": 21.24
}
我们可以使用此方法获得不同的返回类型:
json config = json::parse(buf);
std::cout << typeid(config.value("integer", 0)).name() << std::endl; // Return: integer
std::cout << typeid(config.value("name", "Default Name")).name() << std::endl; // Return: stl basic string
std::cout << typeid(config.value("precise", 0.0)).name() << std::endl; // Return: double
如您所见,它会自动为我们的密钥强制转换有效的数据类型。
现在,我想将这些不同的类型值存储在std::map
容器中。但是,stl map 仅支持一种数据类型:
enum TestEnum {
TEST_MY_INTEGER_VALUE,
TEST_NAME_OF_SOMETHING,
TEST_PRECISE_VALUE,
}
std::map<TestEnum, (what I'm supposed to write here?)> values;
我对此进行了研究,事实证明我可以使用Boost.Variant
类来实现这一点,但是我的项目非常小,我宁愿不使用它任何框架。只有纯C++11方法。
那么,如何将 value()
方法返回的不同返回类型存储到 map 容器中呢?
如果你能用C++17,那么你就可以用std::variant
。
如果您无法使用 C++17,则可以使用任何小型库来代替 Boost,例如 C++11/C++14 的std::variant
实现。
并且您可以使用相同的功能实现自己的类类型 std::variant
,但我强烈建议不要这样做,因为很难提供异常安全性和另一种不明显的情况。
对于只有几种类型(int
、string
、bool
、float
(的简单情况,你可以实现几种类型的JsonInt
,JsonString
并从常见的抽象类JsonType
继承它。
相关文章:
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 定义具有非标准签名的自定义映射比较器
- 如何将整数向量插入到键中,标准::映射的值
- 标准::映射::合并的计算时间复杂度
- 标准::映射转换器模板
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 替换标准::映射值时崩溃
- 标准::键映射和/或 boost::any 类型的值的类型检查
- 如果可能,标准::映射分配是否静态
- 如何在标准::映射中try_emplace POD 结构?
- 如何通过套接字传输标准::多映射数据
- 多类型标准映射
- 五月标准::映射键地址值数
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 模板标准::映射为类成员
- 模板标准::映射::迭代器实例化
- C++ 如何在标准::多映射中插入
- 推进标准映射的迭代器
- 标准::映射 标准::集合包含重复的键
- std::映射标准分配器性能与块分配器