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