Как стать автором
Обновить

Комментарии 12

Очередной велосипед? Есть классический gengetopt для этих целей. Но перспективнее boost::program_options.
Спасибо. В следующий раз буду копать в указанную сторону.
НЛО прилетело и опубликовало эту надпись здесь
Признаюсь, не знал. Мне вообще попал в руки парсер с кучей if-ов
Просмотрел код, я так понимаю ваш разборщик умеет парсить только простые параметры, без переменных, т.е. напрмиер строку типа
dd if=~/some.iso of=/dev/sdb
или
mysqldump --user=root --password=pass --databases mydb1

он не разберет, какой в нем тогда смысл? Простые параметры парсить вообще не зачем — читай себе argv и читай, вот и весь парсинг
Вот если вы прочитаете внимательно последний абзац, то, наверно, поймете, что главной целью этого алгоритма является — передача по наследству. Для каждой программы, решающей подобную задачу, набор параметров разный, и каждый раз копаться в сильноветвящейся структуре из условных конструкций, мягко говоря, неудобно.
Парсить сложные строки, по задаче, не надо. Стандарт оформления был взят из man gcc.
Если это не универсальное решение, а просто решения для проблем какой-то одной компании и одного программиста, то какой смысл об этом рассказывать? Все что вы показали. это то что можно хранить указатели на функции в контейнере, ну так это базовая возможность языка, любой, кто прочитал хотя бы пару книжек по С++, об этом знает.
Еще мне не понятно, о какой сильно ветвящейся структуре вы говорите, если вы можете отобразить ее в линейный список, по вашему коду видно, что на один параметр вызывается один метод, он не подходит для случаев композиции параметров, т.е. нельзя используя ваш подход сделать что-то типа:
«Если присутсвует параметр -p параметр -l выполняет операцию L1 иначе L2», либо вы будете вынуждены в некотором промежуточном методе L выяснять присутствует ли в списке параметр -p и на основе этого выбирать поведение L1 или L2 — а этот означает использование конструкции ветвления. Т. е. в таком случае, вы сможете избежать только верхнего слоя условий.
Согласен, условие будет, но оно не будет вложено во вложенное, вложенное во вложенное…
Да и вообще, наша с вами дискуссия потеряла смысл, так как комментом выше выяснилось, что я поспешил и не подумал о том, что есть готовые решения для данной задачи.
Не понял, в вашем случае argv[] чем не устраивает?
funcTable.insert(TFuncTable::value_type(AnsiString("-myParam"), addr));
А чем не устроил такой вариант: funcTable["-myParam"] = addr?
P.S. Осильте, плз, форматирование кода
Не знаю почему, но такой вариант не работал.

Может быть уже и не надо, тоже была задача код с Java в С++ CLI перекодить, тоже думал про boost (т.к. нужен был cross-paltform) или велосипед. В итоге не хотелось из-за этой не большой таски boost тащить и сделал велосипед :), т.к. хотелось полегче и попроще все-таки. Парсит вроде всё, опции, параметры, подкоманды, вот исходники, если еще интересно можете посмотреть, поюзать: https://github.com/gera-gas/ApplicationHelpers/tree/master/Source/CmdLine

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории