Комментарии 12
Очередной велосипед? Есть классический gengetopt для этих целей. Но перспективнее boost::program_options.
Просмотрел код, я так понимаю ваш разборщик умеет парсить только простые параметры, без переменных, т.е. напрмиер строку типа
dd if=~/some.iso of=/dev/sdb
или
mysqldump --user=root --password=pass --databases mydb1
он не разберет, какой в нем тогда смысл? Простые параметры парсить вообще не зачем — читай себе argv и читай, вот и весь парсинг
dd if=~/some.iso of=/dev/sdb
или
mysqldump --user=root --password=pass --databases mydb1
он не разберет, какой в нем тогда смысл? Простые параметры парсить вообще не зачем — читай себе argv и читай, вот и весь парсинг
Вот если вы прочитаете внимательно последний абзац, то, наверно, поймете, что главной целью этого алгоритма является — передача по наследству. Для каждой программы, решающей подобную задачу, набор параметров разный, и каждый раз копаться в сильноветвящейся структуре из условных конструкций, мягко говоря, неудобно.
Парсить сложные строки, по задаче, не надо. Стандарт оформления был взят из man gcc.
Парсить сложные строки, по задаче, не надо. Стандарт оформления был взят из man gcc.
Если это не универсальное решение, а просто решения для проблем какой-то одной компании и одного программиста, то какой смысл об этом рассказывать? Все что вы показали. это то что можно хранить указатели на функции в контейнере, ну так это базовая возможность языка, любой, кто прочитал хотя бы пару книжек по С++, об этом знает.
Еще мне не понятно, о какой сильно ветвящейся структуре вы говорите, если вы можете отобразить ее в линейный список, по вашему коду видно, что на один параметр вызывается один метод, он не подходит для случаев композиции параметров, т.е. нельзя используя ваш подход сделать что-то типа:
«Если присутсвует параметр -p параметр -l выполняет операцию L1 иначе L2», либо вы будете вынуждены в некотором промежуточном методе L выяснять присутствует ли в списке параметр -p и на основе этого выбирать поведение L1 или L2 — а этот означает использование конструкции ветвления. Т. е. в таком случае, вы сможете избежать только верхнего слоя условий.
Еще мне не понятно, о какой сильно ветвящейся структуре вы говорите, если вы можете отобразить ее в линейный список, по вашему коду видно, что на один параметр вызывается один метод, он не подходит для случаев композиции параметров, т.е. нельзя используя ваш подход сделать что-то типа:
«Если присутсвует параметр -p параметр -l выполняет операцию L1 иначе L2», либо вы будете вынуждены в некотором промежуточном методе L выяснять присутствует ли в списке параметр -p и на основе этого выбирать поведение L1 или L2 — а этот означает использование конструкции ветвления. Т. е. в таком случае, вы сможете избежать только верхнего слоя условий.
Не понял, в вашем случае argv[] чем не устраивает?
funcTable.insert(TFuncTable::value_type(AnsiString("-myParam"), addr));
А чем не устроил такой вариант: funcTable["-myParam"] = addr?
P.S. Осильте, плз, форматирование кода
А чем не устроил такой вариант: funcTable["-myParam"] = addr?
P.S. Осильте, плз, форматирование кода
Не знаю почему, но такой вариант не работал.
Может быть уже и не надо, тоже была задача код с Java в С++ CLI перекодить, тоже думал про boost (т.к. нужен был cross-paltform) или велосипед. В итоге не хотелось из-за этой не большой таски boost тащить и сделал велосипед :), т.к. хотелось полегче и попроще все-таки. Парсит вроде всё, опции, параметры, подкоманды, вот исходники, если еще интересно можете посмотреть, поюзать: https://github.com/gera-gas/ApplicationHelpers/tree/master/Source/CmdLine
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
C/C++. Способ разбора командной строки