2010-11-09 2 views
1

Вот полосатый вниз версия одного из примеров в повышение :: program_options:Проблема с описанием вариантов подталкивание программы

#include <boost/program_options.hpp> 
namespace po = boost::program_options; 

#include <iostream> 
#include <iterator> 
using namespace std; 

int main(int argc, char *argv[ ]) 
{ 
    try { 
     int opt; 
     po::options_description desc("Allowed options"); 
     desc.add_options() 
      ("help", "produce help message") 
      ("optimization", po::value<int>(&opt)->default_value(10), "optimization level") 
      ("verbose", po::value<int>()->implicit_value(1), "enable verbosity (optionally specify level)" ) 
     ; 

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


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

     if (vm.count("verbose")) 
     { 
      cout << "Verbosity enabled. Level is " << vm[ "verbose" ].as<int>() << "\n"; 
     } 
    } 
    catch(std::exception& e) 
    { 
     cout << e.what() << "\n"; 
     return 1; 
    }  
    return 0; 
} 

Когда я бегу это с --help я получаю этот выход:

Usage: options_description [options] 
Allowed options: 
    --help     produce help message 
    --optimization arg (=10) optimization level 
    --verbose [=arg(=1)]  enable verbosity (optionally specify level) 

Есть ли способ избавиться от столбца = в столбце параметров или, возможно, просто отбросить отображение дефолтных и неявных аргументов?

+0

, так что вы хотите значения по умолчанию (или неявные), но вы не хотите видеть, что указано в тексте справки? –

+0

@ Сэм, который является правильным –

+0

Что-то еще - это описание каждого пользователя, потому что я видел, что выходы из учебников не имеют всего этого в только аргументе? –

ответ

1

Вы можете адаптировать технику hidden options, чтобы предоставить один набор параметров для синтаксического анализа и другой набор для печати справки. Однако вам потребуется сохранить две копии списка опций.

Например, начните с текущего desc определения, а затем под ним добавить еще один:

po::options_description display_options("Allowed options"); 
display_options.add_options() 
    ("help", "produce help message") 
    ("optimization", po::value<int>(), "optimization level") 
    ("verbose", "enable verbosity (optionally specify level)") 
    ; 

Продолжать использовать desc для разбора параметров командной строки:

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

Но использование новое описание варианта для показа документации:

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

Это должно показать, что у optimization есть аргумент, но он не покажет, каково его значение по умолчанию, и оно не признает, что принимает любой аргумент вообще.

1

Если он не встроен, вы можете адаптировать options_description и реализовать свой собственный operator<< на основе того, что находится в заголовке boost.

Возможно, вы сможете сделать это, используя метод print.

operator<< просто звонит до print, чтобы вы сами могли видеть.