最近我开始使用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()
方法返回的不同返回类型存储到地图容器中?
答案 0 :(得分:1)
如果你能使用C ++ 17,那么你可以使用std::variant
。
如果你不可能使用C ++ 17,那么可以使用任何小型库而不是Boost,例如std::variant
的{{1}}实现C ++ 11 / C ++ 14
并且您可以使用std::variant
的相同功能实现自己的类类型,但我强烈建议不要这样做,因为很难提供异常安全性和其他非显而易见的情况。
对于仅包含多种类型(int
,string
,bool
,float
)的简单案例,您可以实现多种类型JsonInt
,{{ 1}}并从公共抽象类JsonString
继承它。