C++ 多类型stl图

C++ 多类型stl图,c++,c++11,dictionary,stl,C++,C++11,Dictionary,Stl,最近我开始使用。它有一个允许获取任何类型数据的控件,返回时将自动转换该值,例如: 使用以下JSON时: { "name": "Stackoverflow", "integer": 1234, "precise": 21.24 } 我们可以使用此方法获得不同的返回类型: json config = json::parse(buf); std::cout << typeid(config.value("integer", 0)).name() << std::

最近我开始使用。它有一个允许获取任何类型数据的控件,返回时将自动转换该值,例如:

使用以下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
我对此做了研究,结果证明我可以使用
Boost.Variant
类来实现这一点,但是我的项目非常小,我不想使用任何框架。只有纯C++11方法


那么,如何将
value()
方法返回的不同返回类型存储到映射容器中呢?

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

如果您无法使用C++17,那么可以使用任何小型库来代替Boost,例如C++11/C++14的
std::variant
实现

您可以使用与
std::variant
相同的功能来实现自己的类类型,但我强烈不推荐使用它,因为它很难提供异常安全性和其他不明显的情况


对于只有几种类型(
int
string
bool
float
)的简单示例,您可以实现几种类型的
JsonInt
JsonString
,并从公共抽象类
JsonType

值的类型(“somename”,默认值)继承它
由传递的
默认值的类型决定,而不是由
“somename”
指定的字段的实际类型决定。这里只是一堆重载,第二个参数决定调用哪个重载
typeid
是一个编译时运算符,其结果不可能取决于运行时碰巧解析的实际JSon编码字符串。在该库中,
JSon
对象存储所有可能值类型的并集;其中之一是表示JSon对象的
std::map
(属性名到值的映射)。因此,基本上,
json
是对一组硬编码类型的
变体的有限实现。你说的是对的,但是我不想把这个问题与库联系起来(因此没有关于它的标记)。您可以将其视为我想要存储的多种类型的示例。一般来说,我正在寻找一种在容器中存储混合类型的解决方案。类型也可以是
bool
int
std::string
以及命名结构。我认为使用模板类型的结构是可能的,虽然我还在阅读有关这方面的文章,但我会一直等待任何关于这方面的答案@杰斯珀朱尔·戈尔登;-)不过是C++17。
enum TestEnum {
   TEST_MY_INTEGER_VALUE,
   TEST_NAME_OF_SOMETHING,
   TEST_PRECISE_VALUE,
}

std::map<TestEnum, (what I'm supposed to write here?)> values;