多类型标准映射

Multitype stl map

本文关键字:映射 标准 多类型      更新时间:2023-10-16

最近我开始使用这个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 ,但我强烈建议不要这样做,因为很难提供异常安全性和另一种不明显的情况。

对于只有几种类型(intstringboolfloat(的简单情况,你可以实现几种类型的JsonIntJsonString并从常见的抽象类JsonType继承它。