Проблема с описаниями вариантов программы Boost
-
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.