Как обнаружить опечатку с помощью Boost.program_options? - PullRequest
7 голосов
/ 25 октября 2011

Я использую библиотеку boost.program_options. Рассмотрим этот упрощенный случай.

po::options_description desc("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action");

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

Я хочу выдать ошибку в такой командной строке:

testprog.exe -u c- action1

Обратите внимание, пользователь сделал опечатку "c-" вместо "-c". Но парсер понимает это как одиночную опцию -u. Как мне обращаться с такими случаями?

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

Я хочу выдать ошибку в такой командной строке:

testprog.exe -u c- action1

Обратите внимание, пользователь сделал опечатку "c-" вместо "-c". Но парсер понимает это как единственный параметр -u. Как мне справиться с такими случаями?

Поручите библиотеке program_options не принимать позиционные аргументы, и вы получите желаемое поведение

код и компиляция:

macmini:stackoverflow samm$ cat po.cc
#include <boost/program_options.hpp>
#include <boost/version.hpp>

#include <iostream>

int
main(int argc, char* argv[])
{
    namespace po = boost::program_options;
    po::options_description desc("Usage");
    desc.add_options()
        ("uninstall,u", "uninstall program")
        ("custom,c", po::wvalue<std::wstring>(), "specify custom action")
        ;

    po::variables_map vm;
    po::command_line_parser cmd_line( argc, argv );
    cmd_line.options( desc );
    cmd_line.positional( po::positional_options_description() );

    try {
        po::store( cmd_line.run(), vm );

        po::notify(vm);
    } catch ( const std::exception& e ) {
        std::cerr << e.what() << std::endl;
        return -1;
    }

    return 0;
}
macmini:stackoverflow samm$ g++ po.cc -I /opt/local/include -L/opt/local/lib -lboost_program_options -Wl,-rpath,/opt/local/lib

пробег:

macmini:stackoverflow samm$ ./a.out -u c- action1
too many positional options
macmini:stackoverflow samm$ ./a.out -u -c action1
macmini:stackoverflow samm$ 
2 голосов
/ 25 октября 2011

Сравнить argc-1 с количеством аргументов, найденных program_options? Если это не совпадает, есть синтаксическая ошибка.

Это не охватит все случаи, но может охватить те, которые важны для вас.

0 голосов
/ 25 октября 2011

Я думаю, что единственный способ сделать это - обеспечить присутствие каждого требуемого аргумента, например, путем проверки счетчика каждого типа.

if (vm.count("uninstall")) { ... }
if (vm.count("custom")) { ... }

Вы можете сгенерировать ошибку, если требуемые опции отсутствуют (т. Е. Счет равен 0) или присутствуют (например, -u и -c не может быть указан, будет считаться, что оба значения равны >0).

...