C ++ эквивалент Fortran Namelist - PullRequest
0 голосов
/ 18 мая 2019

Мой вопрос почти идентичен C, эквивалентному списку имен Fortran

Ключевым отличием является то, что я использую C ++ / 17 и хотел бы узнать, есть ли в C ++ более идиоматический способ решения проблемы.

1 Ответ

2 голосов
/ 18 мая 2019

В C ++ нет эквивалента Имени Фортрана . И нет никакого портативного способа достигнуть этого.

Если вы хотите получить аналогичную конструкцию, вам понадобится некоторая общая функция синтаксического анализа, работающая со строками в 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&);. Затем этот перегруженный экстрактор будет работать как в специальном случае для инициализации переменных-членов.

Конечно, я несколько упрощаю алгоритм, так как вам также придется справляться с ошибками во входном файле: что вы будете делать, если ожидаемая переменная отсутствует? что делать, если прочитанное значение несовместимо с целевой переменной?

Если вы переносите код с Фортрана на C ++ и вам необходимо использовать Namelist, чтобы избежать сбоев, это может быть переносимым способом продвижения вперед.

Но если это просто ваша привычка, а формат файла не является обязательным, то вы можете рассмотреть возможность использования json с одной из множества существующих библиотек для чтения и записи этого формата (22 библиотеки перечислены на связанной странице). Преимущество в том, что вам не нужно изобретать велосипед, вы будете более совместимы с множеством других языков, а json кажется более перспективным.

...