как мне получить токены без флагов и без опций после того, как boost::program_options анализирует мои аргументы командной строки
-
19-09-2019 - |
Вопрос
В Python я могу построить свой optparse экземпляр так, что он автоматически отфильтровывает параметры и не-опции/флаги в две разные группы:
(options, args) = parser.parse_args()
Как с помощью boost::program_options получить список токенов, которые являются оставшимися токенами без опций и без флагов?
напримерЕсли в моей программе есть флаги
--foo
--bar BAR
и затем я передаю командную строку:
--foo hey --bar BAR you
как я могу получить список, состоящий исключительно из токенов «эй» и «ты»
Решение
IIRC, вам нужно использовать комбинацию positional_options_description
и скрытые опции.Идея состоит в том, чтобы (1) добавить обычную опцию и дать ей имя, может быть, что-то вроде --positional=ARG
, (2) не включайте эту опцию в описание справки, (3) настройте command_line_parser
относиться ко всем позиционным аргументам так, как будто --positional
был указан, и (4) получить позиционные аргументы, используя vm["positional"].as< std::vector<std::string> >()
.
Вероятно, где-то в дереве исходного кода есть пример, но сейчас его нет на этой машине.
Другие советы
Вот пример:
namespace po = boost::program_options;
po::positional_options_description m_positional;
po::options_description m_cmdLine;
po::variables_map m_variables;
m_cmdLine.add_options()
(/*stuff*/)
("input", po::value<vector<string> >()->composing(), "")
;
m_positional.add("input", -1);
po::parsed_options parsed = po::command_line_parser(argc, argv)
.options(m_cmdLine)
.positional(m_positional)
.allow_unregistered()
.run();
// store, notify, etc
Затем просто получите «входные» именованные параметры в виде вектора строк, и все готово.