LINUX.ORG.RU

boost::program_options запретить ввод positional options

 , ,


0

2

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

//...
    boost::program_options::options_description cmdOptionsPos("Positional options");
    cmdOptionsPos.add_options()
                ("positionalOpts,O",
                 boost::program_options::value<std::vector<std::string>>()->composing(),
                 "Positional options");
    boost::program_options::positional_options_description cmdOptionsPosDesc;
    cmdOptionsPosDesc.add("positionalOpts", -1);
    boost::program_options::variables_map vmPos;

    boost::program_options::store(
                boost::program_options::command_line_parser(argc, argv).
                options(cmdOptionsPos).
                positional(cmdOptionsPosDesc).
                allow_unregistered().
                run(),
                vmPos);
    boost::program_options::notify(vmPos);

    if (vmPos.count("positionalOpts"))
    {
//...
    }
//...
Но может можно как-то указать библиотеке, что-бы она выбрасывала исключение при обнаружении positional options?

★★★★★

Последнее исправление: rumgot (всего исправлений: 2)

Вызвать positional() с пустым boost::program_options::positional_options_description?

    boost::program_options::options_description cmdOptionsPos("Positional options");
    cmdOptionsPos.add_options();
    boost::program_options::positional_options_description cmdOptionsPosDesc;
    boost::program_options::variables_map vmPos;

    boost::program_options::store(
        boost::program_options::command_line_parser(argc, argv).
        options(cmdOptionsPos).
        positional(cmdOptionsPosDesc).
        allow_unregistered().
        run(),
        vmPos);
    boost::program_options::notify(vmPos);

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо большое, это то что нужно.
Чуть чуть упростил твой код:

boost::program_options::variables_map vmPos;
boost::program_options::store(
        boost::program_options::command_line_parser(argc, argv).
        options(boost::program_options::options_description()).
        positional(boost::program_options::positional_options_description()).
        allow_unregistered().
        run(),
        vmPos);
Как думаешь, могут с учетом такого упрощения быть проблемы?

rumgot ★★★★★
() автор топика
Ответ на: комментарий от rumgot

command_line_parser указатели на временные объекты сохраняет, и что-то я не уверен, что он гарантированно будет жить меньше чем они (похоже на unspecified behaviour). Я бы отдельно объявлял.

xaizek ★★★★★
()
Ответ на: комментарий от rumgot

То я случайно оставил. Оно же просто возвращает proxy с перегруженным operator(), там нет ничего особенного.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.