C++ 如何在boost::program_选项中处理未经请求的参数

C++ 如何在boost::program_选项中处理未经请求的参数,c++,boost,boost-program-options,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") ("i

我使用
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);
我希望它将
inputfile.abc
存储在
input file
值中,并将
argument1
argument2
argument3
向量作为未经请求的参数返回

然而,我也希望能够有一个位置参数,这样

./program "inputfile.abc" argument1 argument2 argument3
会给我同样的结果


如果已经有人问过这个问题,我很抱歉,并感谢您的帮助。

我想出了实现这个技巧的代码,但这只是一个小小的解决方法。也就是说,我放弃了positional子句,转而使用未被识别的第一个参数。它似乎工作得很好,但不是很灵活

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>();
使用名称空间boost::program\u选项;
选项描述说明(“允许选项”);
说明添加选项()
(“帮助,h”,“生成帮助消息”)
(“版本,v”,“打印版本号”)
(“包括路径,I”,值(),“包括路径”)
(“输入文件,i”,value(),“输入文件”)
;
变量映射vm;
矢量附加参数;
parsed\u options parsed=命令行\u解析器(ac、av)。
选项(desc).allow_unregisted().run();
存储(已解析,vm);
additionalParameters=collect\u无法识别(已解析的.options、,
包括(位置);;
通知(vm);
如果(!vm.count(“输入文件”))
if(additionalParameters.empty())
{
瑟尔
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>();