C++ 相当于 Fortran 名单

C++ equivalent to Fortran Namelist

我的问题与C equivalent to Fortran namelist

几乎相同

主要区别在于我使用的是 C++/17,想知道是否有更符合 C++ 习惯的方式来解决这个问题。

在 C++ 中没有与 Fortran 的 Namelist 等效的东西。并且没有可移植的方法来实现这一点。

如果你想实现类似的构造,你需要一些通用的解析函数来处理 istream 上的行:

  • 它会读取行并忽略 "!" 之后的任何内容;
  • 它会读取第一个 "&" 后面的名字,看看它是否与预期的名字匹配;
  • 一行中遇到唯一"/"会停止读取;
  • 它会解析每一行in-between,找到一个包含变量名的字符串,"=",以及一个包含相等运算符右侧值的字符串,并存储std::map<std::string,std::string> 中的两个字符串。

对于临时阅读,您将调用解析函数将 istream 行转换为 map。然后您将访问地图以初始化变量。一种简单而强大的方法是使用 stringstream sst(my_map["variable name"]); sst>>my_variable;

如果 Namelist 或多或少对应于 classstruct X,那么惯用法就是重载 friend istream& operator>> (istream&, X&);。然后,这个重载的提取器将像 ad-hoc 的情况一样工作以初始化成员变量。

当然,我稍微简化了算法,因为您还需要处理输入文件中的错误:如果缺少预期变量,您会怎么做?如果读取的值与目标变量不兼容怎么办?

如果您要将 Fortran 代码迁移到 C++,并且必须使用 Namelist 来避免中断,这可能是一种可移植的方式。

但如果只是你的习惯,文件格式不是强制的,那么你可以考虑使用json,现有的众多库中的一个可以读写这种格式(22个库是列在链接页面上)。优点是你不必重新发明轮子,你可以与很多其他语言更好地互操作,而且 json 似乎更 future-proof。