Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

boost,program_options

84  
  Chipolino местный житель03.02.07 19:49
03.02.07 19:49 
Всем привет !
Решил воспользоваться boost-овским libprogram_options вместо любимого getopt-а для разбора аргументов .
Вс╦ очень радует , сам только начинаю разбираться в этой библиотеке .
Но что-то не получается вычитать vector <string> .
Делаю следующие телодвижения :
В ответ на:

// создаю options_description
options_description desc("Allowed options");
desc.add_options()("help,h","produce help message")
(всякая шняга)
("filelist,l",value< vector<string > >(),"anything");
variables_map vm;
store(parse_command_line(argc,argv,desc),vm);
notify(vm);// кстати,нахрена это нужно ?
....разбор аргументов
... вс╦ чудно работа╦т
...начинаем
if(vm.count("filelist")){
vector<string> vec = vm["filelist"].as<vector <string> >();
// в векторе почему-то оказывается только один элемент (vec.size()=1)
// разумеется первый в списке , остальные просто игнорируется
// при "prog --filelist file1 file2 file2" в векторе только file1

Что я делаю не так ?
Наверное нужно просто отдохнуть ...
#1 
  scorpi_ коренной житель03.02.07 22:37
NEW 03.02.07 22:37 
в ответ Chipolino 03.02.07 19:49, Последний раз изменено 03.02.07 22:49 (scorpi_)
Ты не так задаёшь аргументы. Надо так: "prog --filelist file1 --filelist file2 --filelist file3". Или кратко: "prog -l file1 -l file2 -l file3".
PS Notify нужен только в том случае, если ты указываешь callback-функции. Я честно говоря тоже не понимаю, зачем здесь нужны колбэки. Получается просто два разных способа получить эти данные.
В ответ на:
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
#include <algorithm>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/parsers.hpp>
namespace po = boost::program_options;
void cb( const std::vector< std::string >& v )
{
std::copy( v.begin(), v.end(), std::ostream_iterator<std::string>( std::cout, "\n" ) );
}
int main( int ac, char **av )
{
po::options_description desc("Allowed options");
desc.add_options()
("include-path,I", po::value< std::vector<std::string> >()->notifier(&cb), "include path");
po::variables_map vm;
po::store( po::parse_command_line( ac, av, desc ), vm );
po::notify( vm );
if ( vm.count("include-path") )
{
std::vector<std::string> const& v = vm["include-path"].as< std::vector<std::string> >();
std::copy( v.begin(), v.end(), std::ostream_iterator<std::string>( std::cout, "\n" ) );
}
}

#2 
  Chipolino местный житель04.02.07 13:46
NEW 04.02.07 13:46 
в ответ scorpi_ 03.02.07 22:37
Да уж...
Что-то я протормозил ;-)
Спасибо ;-)
#3