Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于从脚本中读取任意类型变量的单一数据结构,用于在运行时检索和编辑_C++_Database_Data Structures_Scripting - Fatal编程技术网

C++ 用于从脚本中读取任意类型变量的单一数据结构,用于在运行时检索和编辑

C++ 用于从脚本中读取任意类型变量的单一数据结构,用于在运行时检索和编辑,c++,database,data-structures,scripting,C++,Database,Data Structures,Scripting,我想为一些机器人软件存储任意参数数据。我将举例说明我想做什么: 比如说,我想存储变量fourped.gait.step_height=0.25和fourped.gait.gait_type=trot,这应该分解为 可变地图[四足动物][步态][步幅高度]=0.25; 或 可变步态图[四足动物][步态][步态类型]=小跑; 如果我知道变量的类型,那么我当前必须处理此类事情的代码工作正常: std::map var_-map; 样板 void set_variablestd::字符串键,X变量 {

我想为一些机器人软件存储任意参数数据。我将举例说明我想做什么:

比如说,我想存储变量fourped.gait.step_height=0.25和fourped.gait.gait_type=trot,这应该分解为

可变地图[四足动物][步态][步幅高度]=0.25; 或

可变步态图[四足动物][步态][步态类型]=小跑; 如果我知道变量的类型,那么我当前必须处理此类事情的代码工作正常:

std::map var_-map; 样板 void set_variablestd::字符串键,X变量 { 变量映射[键]=&var; } 样板 X get_variablestd::字符串键 { return*重新解释castvar映射[键]; } 这就完成了将每个变量存储在以下文件中这项看起来不太干净的任务:

可变地形图[四足动物步态步高]=0.25; 这感觉像是做我想做的事的卑劣方式。我需要提前知道变量的类型:

设置_variablequadreped.PID.workspace.active,true; bool workspace\u active=get\u variablequadreped.PID.workspace.active; 理想情况下,我希望在启动时在XML读取器或某种脚本解析格式中处理这种类型的变量赋值

我觉得这是软件开发人员的共同需求,我忍不住觉得我正在重新发明这个问题的轮子。是否有一段开放源代码,最好是具有良好的许可证,或者只是一种更简单的脚本读取方式:

四足动物。步态。步态\计时=[0.5 0.5] 四足动物。步态。步高=0.25 四足动物。步态。步态类型=小跑 四足动物.PID.workspace.active=1 并将其存储为:

变量映射[四足动物][步态][步态计时]=std::向量%包含[0.5 0.5] 可变地图[四足动物][步态][步幅高度]=双0.25; 变形金刚地图[四足动物][步态][步态类型]=std::弦乐小跑; 变量映射[四足动物][PID][workspace][active]=int 1; 或者可能只是以任何方式存储它们,我可以在代码中按名称检索它们,如我前面的示例中所示:

bool workspace\u active=get\u variablequadreped.PID.workspace.active;
谢谢你的帮助。如果您需要进一步澄清我提出的任何观点,我将密切关注这个问题。

您的问题确实是一个常见问题。因此,存在一种常见的解决方案,即存储任意类型的变量

优势在于它根据您所考虑的所有潜在类型构造变量类型并作为模板参数提供:

typedef boost::variant< int, std::string, double> vtype;  
这种方法可以避免常见的问题,例如令人讨厌的失调变量。它还支持一些编译时类型检查,确保您不会意外地使用无法预见的类型

vtype v1, v2; 
v1 = "Hello"; 
v2 = 0.25; 
cout << v1 << v2;  
如果您知道对象中存储的类型,就可以很容易地获取它:而不是像您所做的那样进行冒险的*reinterpret\u转换:boost::get

boost提供了一种访问机制,以优雅的方式提供足够的类型相关代码,用于处理一个变体objet。你会在这个答案开头的链接中找到一些很好的例子

考虑使用,它实现了层次映射,还使用解析器从一些常见格式的文件中读取配置。默认情况下,它以std::string格式存储值,但使用boost::lexical_cast支持在其他类型中设置和获取值。如果需要,可以使用或存储值,但这样会丢失一些解析功能