因此,我知道这不是语言内置的内容(即c ++中没有eval()方法)。我还理解,将运行时输入的字符串的内容与程序中的变量名关联起来非常困难,因为大多数信息都消失了。不过...
我正在尝试编写一个小类,以允许研究小组的用户将材料和材料特性添加到数据库文件中,并使用一个命令调用这些材料,以便在Geant4中轻松进行材料构造。不幸的是,Geant4使用头文件为这些单位定义实际变量,例如cm3,mm,MeV和kg,以将单位转换为内部Geant4单位系统。我不相信有任何一种将这些链接到它们相应的字符串的映射。事实是,Geant4用于物理建模,并且有大量的单位。由于Geant4是可扩展的,并且可能会出现一些新的物理代码,而这些代码需要一个我不知道的新单位,因此我也没有真正的方法可以映射它们。
我想做的是从文本文件中获取描述单位的字符串,并以某种方式将其与相同名称的实际变量进行匹配,以便执行转换。有什么办法可以破解和削减,还是完全不可能(或几乎几乎不可能)?
当然,我可以让人们将所有数据库条目都转换为内部单位,但这很快就会变得丑陋,并且成为难以追踪错误的重要来源(小数点前15位看起来很像14)。
谢谢
最佳答案
这很难回答,部分原因是我从未使用过(或之前从未听说过)Geant4,部分原因还不是很清楚您要做什么:您是否正在为同事直接使用C ++库?还是您正在制作某种无需同事亲自接触即可使用的同事工具?
不过,我会尽力回答。
从根本上讲,如果要在运行时接受文本输入并解释命名的单位,则需要一个从单位名称到定义的映射表(无论这些定义采用何种内部形式)。真的没有办法解决。
但是,您不必手动创建该映射表。该信息必须存在于定义单位的Geant4头文件中,因此您可以编写一个工具(如您所说的那样,用砍和斜线表示)以读取该头文件并为映射表生成代码。
至于将来支持新单位,也许是可行的,但我对您的问题的了解还不够,因此无法提出特定的解决方案。
我会在这里稍稍走出去。在Google上快速搜索Geant4,并在我发现的第一个源代码中进行了非常粗略的搜索,将我带到了两个相关的文件:SystemOfUnits.h和G4UnitsTable.hh。
我注意到2确实提供了您可能想要的名称到定义的映射,但是我不清楚它与系统的其余部分之间的关系以及是否相关。
如果1是相关的标头,则很明显,单位的定义是关于最简单的可能:即将因子缩放为基本单位。如果是这种情况,那么没有特殊的原因为什么您的材料数据库文件也不应包含类似种类的单元定义(即,从与加载材料定义相同的位置加载映射表),这将允许您的同事根据需要添加新的单位。
我可能要提到的最后一种可能性是,我同意在对十进制数字进行计数时极容易出错,如果您允许以科学计数法表示值,那么大部分问题就可以解决。因此,可能最简单的解决方案是告诉您的同事使用基本的Geant4单位,如果他们想指定一个值(例如5 km),则应将其指定为5e6(因为长度的Geant4基本单位是毫米,根据1)。