Обработка ‘-‘ с boost.program_options

Прежде чем вы скажете OVERKILL, мне все равно.

Как я могу сделать Boost.program_options обработать необходимые cat вариант -?

я имею

// visible
po::options_description options("Options");
options.add_options()("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.");

po::positional_options_description file_options;
file_options.add("file", -1);

po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(options).positional(file_options).run(), vm);
po::notify(vm);

bool immediate = false;
if(vm.count("-u"))
immediate = true;
if(vm.count("file"))
support::print(vm["file"].as<vector<string>>());

который выдает исключение, когда я бегу cat - - -:

нераспознанная опция ‘-‘

Я хочу это увидеть - в качестве позиционного аргумента, и мне нужно в правильном порядке в полном списке файлов. Как я мог этого добиться?

ОБНОВИТЬ

У меня есть половина исправить. мне было нужно

po::options_description options("Options");
options.add_options()("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.")
("file", po::value< vector<string> >(), "input file");

po::positional_options_description file_options;
file_options.add("file", -1);

Проблема в том, что я, кажется, получаю только 2 из трех - когда я вывожу аргументы:

if(vm.count("file"))
support::print(vm["file"].as<vector<string>>());

где support :: print хорошо обрабатывает вектор и прочее.

6

Решение

Вам нужно определить опцию именованной программы, которая является позиционной, в вашем случае это file

#include <boost/foreach.hpp>
#include <boost/program_options.hpp>

#include <iostream>
#include <string>
#include <vector>

namespace po = boost::program_options;

int
main( int argc, char* argv[] )
{
std::vector<std::string> input;
po::options_description options("Options");
options.add_options()
("-u", po::value<bool>(), "Write bytes from the input file to the standard output without delay as each is read.")
("file", po::value(&input), "input")
;

po::positional_options_description file_options;
file_options.add("file", -1);

po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(options).positional(file_options).run(), vm);
po::notify(vm);

bool immediate = false;
if(vm.count("-u"))
immediate = true;
BOOST_FOREACH( const auto& i, input ) {
std::cout << "file: " << i << std::endl;
}
}

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

$ g++ -std=c++11 -O2 -pthread main.cpp -lboost_program_options && ./a.out - - -
file: -
file: -
file: -

Если вы видите только 2 из 3 позиционных аргументов, скорее всего, потому что argv[0] по соглашению является именем программы и поэтому не рассматривается для разбора аргументов. Это можно увидеть в исходном коде для basic_command_line_parser шаблон

 37     template<class charT>
38     basic_command_line_parser<charT>::
39     basic_command_line_parser(int argc, const charT* const argv[])
40     : detail::cmdline(
41         // Explicit template arguments are required by gcc 3.3.1
42         // (at least mingw version), and do no harm on other compilers.
43         to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
44     {}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]