Boost-program-options: notifier для опций без значения
Можно использовать notifier для проанализированных опций, только если у них есть value_semantic.
Каков наилучший способ автоматического управления параметрами без значения данным уведомителем?
Простой подход состоит в том, чтобы сделать фиктивный value_semantic с неявным назначением, поэтому пользователь может передать параметр без значения.
Это приводит к возможности явно предоставленных значений.
Можно добавить проверку времени выполнения, если это значение было предоставлено, и вызвать ошибку.
Обновление:
НО, это не работает при наличии позиционных опций, потому что значение опциона позиции может следовать за опцией no-value, создавая исключение как s заданное значение.
Ответы
Ответ 1
Один парень 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
Ответ 2
Это полный пример предоставления флага в качестве опции для дополнения текущих ответов:
#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;
}
Mine qmake pro file (я использую 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' option/:
./untitled4 -o
overwrite is: true
Ответ 3
Используйте модификатор zero_tokens
. Кажется, вам также нужно использовать implicit_value
, но все, что предоставляется после имени параметра, не будет потребляться парсером параметров. Вместо этого, когда опция замечена в командной строке, имплицитное значение будет присвоено этой опции, вызывая функцию notifier (поэтому убедитесь, что вы предоставили функцию уведомления). По-видимому, также важно, чтобы тип значения параметра был string
. Я не понимаю, почему.
void got_foo(std::string const&);
desc.add_options()
("foo",
po::value<std::string>()
->implicit_value("")
->zero_tokens()
->notifier(&got_foo),
"foo description")
;