如何在boost :: program_options中处理未经请求的参数

时间:2012-04-16 17:09:16

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

我使用boost::program_options为我的应用程序提供命令行解析接口。我想配置它来解析选项,

using namespace boost::program_options;
options_description desc("Allowed options");
desc.add_options()
    ("help,h", "produce help message")
    ("version,v", "print the version number")
    ("include-path,I", value< vector<string> >(), "include path")
    ("input-file,i", value<string>(), "input file");

positional_options_description p;
p.add("input-file", 1);

variables_map vm;

parsed_options parsed = command_line_parser(ac, av).
options(desc).positional(p).run();
store(parsed, vm);
notify(vm);

我想配置它,以便以向量的形式返回最后一次切换后的每个标记。我已尝试使用collect_unrecognized作为Boost文档中给出的示例,但我遇到了一些问题,因为我也使用位置参数作为输入文件。

基本上我想这样做。如果我有:

./program -i "inputfile.abc" argument1 argument2 argument3

我希望将inputfile.abc存储在input-file值中,并返回vector<string> argument1argument2argument3作为未经请求的参数。

我也希望能够有一个位置参数,所以

./program "inputfile.abc" argument1 argument2 argument3

会给我相同的结果。

如果已经提出要求,我很抱歉,谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

我提出了可以解决问题的代码,但这是一个小小的解决方法。也就是说,我放弃了位置条款并采取了未被承认的第一个参数。它似乎工作正常,但它不是很灵活。

using namespace boost::program_options;

options_description desc("Allowed options");
desc.add_options()
    ("help,h", "produce help message")
    ("version,v", "print the version number")
    ("include-path,I", value< vector<string> >(), "include path")
    ("input-file,i", value<string>(), "input file")
    ;

variables_map vm;
vector<string> additionalParameters;

parsed_options parsed = command_line_parser(ac, av).
    options(desc).allow_unregistered().run();
store(parsed, vm);
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional);
notify(vm);

if (!vm.count("input-file"))
    if (additionalParameters.empty()) 
    {
        cerr << "error: No input file specified\n";
        return EXIT_FAILURE;
    } 
    else
    {
        inputFileName = additionalParameters[0];
        additionalParameters.erase(additionalParameters.begin());
    }
else
    inputFileName = vm["input-file"].as<string>();