Multitype stl地图

时间:2017-11-16 04:33:58

标签: c++ c++11 dictionary stl

最近我开始使用this JSON library。它有nice method允许获取任何类型的数据,并且值将在返回时自动转换,例如:

使用以下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()方法返回的不同返回类型存储到地图容器中?

1 个答案:

答案 0 :(得分:1)

如果你能使用C ++ 17,那么你可以使用std::variant

如果你不可能使用C ++ 17,那么可以使用任何小型库而不是Boost,例如std::variant的{​​{1}}实现C ++ 11 / C ++ 14

并且您可以使用std::variant的相同功能实现自己的类类型,但我强烈建议不要这样做,因为很难提供异常安全性和其他非显而易见的情况。

对于仅包含多种类型(intstringboolfloat)的简单案例,您可以实现多种类型JsonInt,{{ 1}}并从公共抽象类JsonString继承它。