代码之家  ›  专栏  ›  技术社区  ›  Alien_SM

boost程序选项描述有问题

  •  1
  • Alien_SM  · 技术社区  · 15 年前

    下面是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)
    

    2 回复  |  直到 15 年前
        1
  •  1
  •   Rob Kennedy    15 年前

    你可以采用 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)")
        ;
    

    继续使用 用于分析命令行选项:

    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 接受任何论据。

        2
  •  1
  •   Steve Townsend    15 年前

    如果不是内置的,你可以适应 options_description operator<< 基于boost标题中的内容。

    您可以使用 print 方法。

    操作员<< 打印