我有一个使用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
答案 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 IDList
是correct approach。
答案 1 :(得分:0)
您可以尝试编写自己的函数来解析命令行选项:
您编写自己的解析器函数,例如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