2013-01-02 18 views
16

Podczas korzystania z biblioteki Boost, program_options to jest bardzo łatwe do wydrukowania pomoc dla programu:Drukuj pomoc dla obu normalnych i pozycyjnych args z boost :: program_options

boost::program_options::variables_map options; 
boost::program_options::options_description optionsDesc; 
boost::program_options::positional_options_description positionalOptionsDesc; 
//... 
if(options.count("help")) 
{ 
    cerr << optionsDesc << endl; 
} 

ale jak można dodać opcje z positional_options_description do komunikat pomocy? W tutorialu widzę wyjście z takiej konfiguracji, na końcu sekcji:

http://www.boost.org/doc/libs/1_52_0/doc/html/program_options/tutorial.html#id2607297

Opcja input-file jest drukowany w pomoc i to pozycyjny. Ale nie widzę kodu. Czy jest wbudowany sposób wydrukowania go, tak jak w przypadku options_description, czy trzeba to zrobić ręcznie? Widocznie << nie działa positional_options_description, błąd kompilacji:

error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 
+3

Jeśli to pomaga, możesz znaleźć pełny kod [tutaj] (http://www.boost.org/libs/program_options/example/options_description.cpp). –

+0

Dzięki llonesmiz, to naprawdę bardzo pomogło! Chodzi o to, że nie muszę dodawać argumentów pozycji do 'options_description', jeśli dodam je do' position_options_description', ale musisz dodać oba. – nuoritoveri

Odpowiedz

5

Uwaga, strumieniowe opis drukuje tylko opcje. Nie wyświetla nazwy programu ani rzeczywistego opisu programu. ręcznie należy wydrukować dowolny parametr pozycyjny masz jako część komunikatu wyjściowego:

Zamiast

if (vm.count("help")) { 
    cout << "Usage: options_description [options]\n"; 
    cout << desc; 
    return 0; 
} 

Można łatwo powiedzieć

if (vm.count("help")) { 
    cout << "Usage: " << argv[0] << " [options] <description of positional 1> <description of positional 2> ...\n"; 
    cout << desc; 
    return 0; 
} 
+0

Tak jak powiedziałem w komentarzu do pytania, nie dodawałem argumentu pozycji do 'options_description', tylko do' position_options_description'. Dlatego nie został wydrukowany. Zwykle tak działa, więc kod jest tym, co chciałem, po prostu popełniłem błąd w innym miejscu. Zgadzam się również, że dobrze jest wydrukować użycie na samym początku. – nuoritoveri

1

Wystarczy popatrzeć na boost :: program_options :: pozitional_options_description.name_for_position (i)

Komunikat o błędzie to coś niezwiązanego ze sobą, zapomniałem, co to właściwie ma związek z cpp11