我的问题与C等价于Fortran名称几乎完全相同
关键的区别在于,我使用的是C++/17,我想知道是否有更多的C++惯用的方式来解决这个问题。
发布于 2019-05-18 18:39:34
这与Fortran的纳梅利斯特在C++中是不一样的。没有一种便携的方法来实现这一目标。
如果您想实现类似的构造,那么需要一些通用的解析函数来处理istream上的行:
"!"后面的任何内容;"&"后面的名称,以查看它是否与预期的名称匹配;"/"时,它将停止阅读;"=" )和一个在相等操作符右侧具有值的字符串,并将这两个字符串存储在一个std::map中。对于即席阅读,您可以调用解析函数将istream行转换为map。然后访问映射来初始化变量。一种简单而强大的方法是使用stringstream sst(my_map["variable name"]); sst>>my_variable;
如果名称列表或多或少与class或struct X相对应,则成语将是重载friend istream& operator>> (istream&, X&);。然后,这个重载的提取器将像在特殊情况下一样工作,以初始化成员变量。
当然,我在一定程度上简化了算法,因为您还需要处理输入文件中的错误:如果缺少预期变量,怎么办?如果读取的值与目标变量不兼容,怎么办?
如果您要将Fortran代码迁移到C++,并且必须使用Namelist来避免中断,这可能是一种可移植的前进方式。
但是,如果这只是您的习惯,并且文件格式不是强制性的,那么您可以考虑使用json,其中一个库可以读取和写入这种格式(链接页面中列出了22个库)。优点是你不必重新发明轮子,你可以更好地与许多其他语言交流,而json似乎更能证明未来。
https://stackoverflow.com/questions/56198656
复制相似问题