我的问题与C equivalent to Fortran namelist完全相同
主要区别在于我使用的是C ++ / 17,想知道是否还有其他C ++惯用的方式来解决问题。
答案 0 :(得分:1)
在C ++中没有等效于Fortran的Namelist。而且没有便携式的方法可以实现这一目标。
如果要实现类似的构造,则需要一些常规的解析函数,这些函数使用istream
上的行:
"!"
之后的所有内容; "&"
之后的名称,以查看其是否与预期名称匹配; "/"
时,它将停止阅读; "="
的字符串以及一个等于操作符右侧值的字符串,并将这两个字符串存储在std::map<std::string,std::string>
。 对于临时读取,您可以调用解析函数将istream
行转换为map
。然后,您将访问映射以初始化变量。一种简单而有效的方法是使用stringstream sst(my_map["variable name"]); sst>>my_variable;
如果名称列表或多或少地对应于class
或struct
X
,那么习惯用法就是重载friend istream& operator>> (istream&, X&);
。然后,此重载的提取器将像在临时情况下一样工作以初始化成员变量。
当然,我会简化算法,因为您还需要处理输入文件中的错误:如果缺少预期变量该怎么办?如果读取的值与目标变量不兼容怎么办?
如果要将Fortran代码迁移到C ++,并且必须使用“名称列表”以避免中断,则这可能是一种可移植的前进方式。
但是,如果这只是您的习惯,并且文件格式不是强制性的,那么您可以考虑使用json,并拥有许多可读写此格式的库(其中列出了22个库)链接的页面)。优点是您不必重新发明轮子,可以与许多其他语言互操作,并且json似乎更适合未来。