Проблема с описаниями вариантов программы Boost

StackOverflow https://stackoverflow.com/questions/4137131

  •  30-09-2019
  •  | 
  •  

Вопрос

Вот полосатая версия одного из примеров в Boost :: 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)

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

Это было полезно?

Решение

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

Например, начните с вашего текущего 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 есть аргумент, но он не покажет, каково это значение по умолчанию, и не признает, что verbose принимает любой аргумент вообще.

Другие советы

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

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

operator<< Просто звонит в print Так что вы можете увидеть свой собственный Afai.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top