boost-program-options: уведомитель для опций без значения - PullRequest
24 голосов
/ 24 августа 2011

Можно использовать уведомитель для проанализированных опций, только если у них есть value_semantic.Каков наилучший способ автоматической обработки параметров без значения данным уведомителем?

Простой подход - создать фиктивную value_semantic с неявным присваиванием, чтобы пользователь мог передать опцию без значения.Это приводит к возможности явно предоставленных значений.Можно добавить проверку во время выполнения, было ли предоставлено значение, и выдать ошибку.

Обновление: НО, это не работает при наличии позиционных опций, потому что значение позиционной опции может следовать за опцией без значения, вызывая исключение в качестве заданного значения.

Ответы [ 3 ]

40 голосов
/ 02 сентября 2011

Один парень OXPEHOMETP на российском форуме программистов дал мне пару советов по использованию boost::program_options::bool_switch().

При определении опции без значения через интерфейс с допустимым значением следует передавать не boost::program_options::typed_value() в качестве семантики, а bool_switch().Это означает, что никакое значение не может быть явно взято для этой опции из командной строки.Информацию об этом можно найти на http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html

22 голосов
/ 25 января 2015

Это полный пример предоставления флага в качестве опции для дополнения текущих ответов:

#include <iostream>

#include <boost/program_options.hpp>

using namespace std;

namespace po = boost::program_options;


int main(int ac, char* av[])
{
    po::options_description desc("Allowed options");

    desc.add_options()
        ("help", "produce help message")
        ("overwrite,o", po::bool_switch()->default_value(false),
                        "enable file overwrite");

    po::variables_map vm;
    po::store(po::parse_command_line(ac, av, desc), vm);

    boolalpha(cout);  // display true and false for bool
    cout << "overwrite is: " << vm["overwrite"].as<bool>() << endl;

    return 0;
}

Мой файл qmake pro (я использую Qt 5.4):

TEMPLATE = app
CONFIG += console
CONFIG += c++14
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp


include(deployment.pri)
qtcAddDeployment()

INCLUDEPATH += /opt/boost_1_57_0

unix:!macx: LIBS += -L/opt/boost_1_57_0/stage/lib -lboost_program_options

Запуск программы без каких-либо опций приводит к:

./untitled4
overwrite is: false

Однако запуск с параметром -o '-o' дает:

./untitled4 -o
overwrite is: true
1 голос
/ 30 августа 2011

Используйте модификатор zero_tokens.Кажется, вам также необходимо использовать implicit_value, но все, что указано после имени параметра, не будет использовано анализатором параметров.Вместо этого, когда опция замечена в командной строке, ей будет присвоено неявное значение, которое активирует уведомитель опции (поэтому обязательно предоставьте функцию уведомителя).Очевидно, также важно, чтобы тип значения параметра был string.Я не понимаю, почему.

void got_foo(std::string const&);

desc.add_options()
  ("foo", 
   po::value<std::string>()
     ->implicit_value("")
     ->zero_tokens()
     ->notifier(&got_foo),
   "foo description")
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...