使用boost program-options的无效选项值异常

时间:2011-02-25 17:09:37

标签: c++ boost boost-program-options

我有一个使用boost v1.45.0程序选项的Visual Studio 2008 C ++应用程序。

我希望能够解析一个如下所示的命令行选项:foo.exe -x 1,2, 4-7,以便生成std::vector< int >,其值为[1,2,4,5,6, 7]。所以,我写了一个自定义验证器:

typedef std::vector< int > IDList;

void validate( boost::any& v, const std::vector< std::string >& tokens, IDList*, int )
{
    // Never gets here
}

int _tmain( int argc, _TCHAR* argv[] )
{
    IDList test_case_ids;

    po::options_description desc( "Foo options" );
    desc.add_options()
        ("id,x", po::value< IDList >(), "Specify a single ID or a range of IDs as shown in the following command line: foo.exe -x10,12, 15-20")
    ;

    po::variables_map vm;

    try
    {
        po::store( po::parse_command_line( argc, argv, desc ), vm );
        po::notify( vm );
    }
    catch( const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        std::cout << desc << std::endl;
        return 1;
    }

    return 0;
}

但是,我从来没有得到我的自定义验证码。我总是在parse_command_line中收到一条例外消息:in option 'id': invalid option value

我需要做些什么才能使其按预期工作?

谢谢, PaulH

3 个答案:

答案 0 :(得分:1)

typedef std::vector<int>作为boost::program_options::value_semantic无法按照您的方式运作,因为vector对程序选项库有special meaning

  

图书馆提供特别支持   对于矢量 - 它将是可能的   多次指定选项,和   将收集所有指定的值   在一个向量中。

这意味着像这样的描述

typedef std::vector< int > IDList;
po::options_description desc( "Foo options" );
desc.add_options()
    ("id,x", po::value< IDList >(), "list of IDs")
;
在给定以下命令行

的情况下,

合并为单个std::vector<int>

a.out --id 1 --id 2 --id 3 --id 4

结果将是std::vector,包含四个元素。您需要定义特定类型才能使用自定义验证程序,struct IDListcorrect approach

答案 1 :(得分:0)

您可以尝试编写自己的函数来解析命令行选项:

See here

您编写自己的解析器函数,例如reg_foo,并按如下方式使用:

variables_map vm;
store(command_line_parser(argc, argv).options(desc).extra_parser(reg_foo)
          .run(), vm);

另请参见示例代码/ boost_syntax.cpp

中使用boost分发的示例代码

答案 2 :(得分:0)

问题是IDList的定义。如果我更改定义以匹配magic_number示例中使用的regex.cpp类型,则可以使用。

struct IDList
{
public:
    std::vector< int > ids_;
    IDList( std::vector< int > ids ) : ids_( ids ) {}
};

我没有调查为什么typedef是框架的问题,但这可行。

-PaulH