标签: boost-program-options

boost program_options接受最后一个标志后的所有值

有没有办法用boost :: program_options收集指定参数后的所有值?虽然我需要注意两个警告,我需要接受无法识别的参数,我需要接受可能包含破折号的值.我尝试过使用command_line_parser和parse_command_line,我可以得到无法识别的或包含破折号的值,但不能同时使用两者.

示例:./ myprog Ignore1 Ignore2 - 接受1 --AlsoAccept 2 --AcceptAll 1 2 -3 4

我真的不关心验证--AcceptAll是最后一个标志; 我只是在寻找逻辑,在该标志之后返回一个字符串向量.

c++ boost boost-program-options

5
推荐指数
1
解决办法
1306
查看次数

来自boost程序选项的布尔选项

我正在使用boost程序选项从命令行参数获取布尔值.我希望我的论点被指定为"Y",是","N","否".

实际上我的代码使用临时字符串来完成它

  1. 将被解析 boost program options
  2. 检查"是","是","否"或"否"
  3. 分配给布尔变量成员.

最重要的是,我还使用另一个临时字符串获取默认值.

我做了所有这些工作,因为我尝试了下面的代码,但是没有用

      namespace pod = boost::program_options;

      ("Section.Flag", 
           pod::value<bool>(&myFlag_bool)->default_value( false ), 
           "description")
Run Code Online (Sandbox Code Playgroud)

你知道升级程序选项是否可以比我用来实现它的更好?

c++ boost-program-options

5
推荐指数
1
解决办法
3319
查看次数

boost program_options:帮助与有意义的选项

有没有一种简单的方法可以将帮助选项与"真正的"程序选项分开?事实上,是否可以定义选项的层次结构,即BNF:

options := help_options | program_options
help_options := '-h'
program_options := '-m1' mode1options | '-m2' mode2options
mode1options := number
...
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法来实现这一目标吗?我应该恢复精神吗?

c++ boost command-line-arguments boost-program-options

5
推荐指数
1
解决办法
911
查看次数

boost :: program_options如何重新加载值

我想从配置文件中重新加载一些值。我知道,po::store如果值存在于中,则不会更改variables_map。是否有替代方法即使值已经存在也可以替换?

我尝试从中删除要重新加载的值variables_map,但是po::store无论如何都不会添加新值(即使也无法访问旧值)。

c++ boost boost-program-options

5
推荐指数
2
解决办法
2307
查看次数

如何使用Boost Program Options提取已解析选项的序列?

我正在使用Boost Graph和Program Options构建图形生成器.例如,有两种类型的组件C和W,每种组件具有1个源,1个接收器和一些附加参数以指定其间的拓扑.我希望能够按照命令行参数的顺序将它们拼接在一起.

例如:

./bin/make_graph -c4,5,1 -w3,3 -c3,1,2
Run Code Online (Sandbox Code Playgroud)

应创建类似于以下内容的图形:

C -- W -- C
Run Code Online (Sandbox Code Playgroud)

但:

./bin/make_graph -c4,5,1 -c3,1,2 -w3,3
Run Code Online (Sandbox Code Playgroud)

应创建类似于以下内容的图形:

C -- C -- W
Run Code Online (Sandbox Code Playgroud)

使用boost :: program_options,我无法确定如何提取确切的顺序,因为它使用value_type == vector <string>(在我的情况下)将相同string_key的选项"组合"到一个映射中.

通过迭代地图,订单就会丢失.有没有办法不重复解析,但每次解析一个选项时都有一个叫做(可能是回调)的函数?我找不到这方面的文件.还有其他建议吗?

为了说服你,我没有说明这一点,这就是我到目前为止所做的:

    namespace bpo = boost::program_options;
    std::vector<std::string> args_cat, args_grid, args_web;
    bpo::options_description desc("Program options:");
    desc.add_options()
            .operator ()("help,h","Displays this help message.")
            .operator ()("caterpillar,c",bpo::value< std::vector<std::string> >(&args_cat)->default_value( std::vector<std::string>(1,"4,7,2"), "4,7,2" ),"Caterpillar tree with 3 parameters")
            .operator ()("grid,g",bpo::value< std::vector<std::string> >(&args_grid)->default_value( std::vector<std::string>(1,"3,4"), "3,4" ),"Rectangular grid with 2 parameters")
            .operator ()("web,w",bpo::value< std::vector<std::string> >(&args_web)->default_value( std::vector<std::string>(1,"3,4"), "3,4" ),"Web with …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

5
推荐指数
1
解决办法
1445
查看次数

如何在--help输出中显示命令行操作数描述

我正在使用Boost.program_options来解析我实现POSIX实用程序的命令行.举个简单的例子吧cmp.

现在我想有一个额外的参数--help来显示所有参数的描述,这在这种情况下很重要.我有:

po::options_description options("Options");
options.add_options()("help", "Show this help output.")
                     (",l", "(Lowercase ell.) Write the byte number (decimal) and the differing bytes (octal) for each difference.")
                     (",s", "Write nothing for differing files; return exit status only.")

po::positional_options_description operands;
operands.add("file1", 1);//, "A pathname of the first file to be compared. If file1 is '-', the standard input shall be used.")
operands.add("file2", 1);//, "A pathname of the second file to be compared. If file2 is '-', the standard input …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

5
推荐指数
1
解决办法
232
查看次数

在Boost program_options中解析配置文件的未注册选项?

使用命令行选项,我可以执行以下操作:

po::variables_map vm;
auto parsedOptions = po::command_line_parser(argc, argv).options(optionsDescription1).allow_unregistered().run();
po::store(parsedOptions, vm);
po::notify(vm);

auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
po::variables_map vm2;
auto parsedOptions2 = po::command_line_parser(unregistered).options(optionsDescription2).run();
po::store(parsedOptions2, vm2);
po::notify(vm2);
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,因为collect_unregistered()收集命令行令牌的方式与命令行中出现的完全相同.但是,它不适用于配置文件.我可以解析一个允许未注册选项的配置文件,但是当我收集未注册的选项时,我得到一个我无法使用的结果.

po::variables_map vm;
auto parsedOptions = po::parse_config_file<char>(filename, optionsDescription1, true);
po::store(parsedOptions, vm);
po::notify(vm);
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到列出的选项的名称和值.例如,如果配置文件包含以下选项:

unregistered_option1=value1
unregistered_option2=value2
Run Code Online (Sandbox Code Playgroud)

然后我得到的值unregistered_option1,value1,unregistered_option2,value2在串矢量unregistered.Boost的解析器无法对此格式执行任何有用的操作.有没有办法解析这个列表(即解析第一个options_description用不同的方法识别的所有选项options_description)?当然我可以用第二个options_descriptionallow_unregisteredset 来解析文件,但是后来我无法检查两个描述都不知道的选项.

c++ boost boost-program-options config-files

5
推荐指数
1
解决办法
2229
查看次数

互斥选项组

我熟悉boost的程序选项实用程序,我想知道是否有一种定义互斥选项组的方法.即,我的程序有不同的流程:

program --first --opt1 --opt2 ...
program --second --opt3 --opt4 ...

所以,我对不同流程的选择是相互排斥的.有没有办法定义互斥的选项组?

当然下面代码会这样做:

 /* Function used to check that 'opt1' and 'opt2' are not specified
   at the same time. */
void conflicting_options(const variables_map& vm, 
                         const char* opt1, const char* opt2)
{
    if (vm.count(opt1) && !vm[opt1].defaulted() 
        && vm.count(opt2) && !vm[opt2].defaulted())
        throw logic_error(string("Conflicting options '") 
                          + opt1 + "' and '" + opt2 + "'.");
}
int main(int ac, char* av[])
{
    try {
        // Declare three groups of options.
        options_description first("First …
Run Code Online (Sandbox Code Playgroud)

c++ boost-program-options

5
推荐指数
0
解决办法
429
查看次数

Boost程序选项bool始终为True

使用程序选项,我正在检查有效的参数组合.但由于某种原因,gpu参数是一个bool,无论我是否在命令行上将其设置为false,它总是正确的.如果我在命令行中指定了gpu选项,有没有办法可以为false?我希望能够创建一个bool变量来表示是否使用了命令行上的选项.

另外,我找不到有关variables_map的count()的任何文档.它是std :: map函数吗?

部分代码:

namespace po = boost::program_options;
po::options_description desc("Allowed Options");
desc.add_options()
  ("help,h", "Produce help message")
  ("remove_database,r",po::value<std::vector<std::string>>
    (&remove_database),
    "Remove a pre-built database, provide a name(s) of the database")
  ("gpu,u", po::bool_switch()->default_value(false),
    "Use GPU? Only for specific algorithms");

po::variables_map vm;
po::store(po::parse_command_line(argc,argv,desc),vm);
po::notify(vm);

//Processing Cmd Args
bool help           = vm.count("help");
bool remove         = vm.count("remove_database");
bool gpu            = vm.count("gpu");

test(help,"help");
test(remove, "remove");
test(gpu, "gpu");

.....
void test(bool var1, std::string var2){
  if(var1)
    std::cout << var2 << " is active " << std::endl;
 else
    std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

5
推荐指数
1
解决办法
2502
查看次数

向量值boost :: program_options的默认值

我有一个boost :: program_options选项,可以将所需的输入选项成功解析为向量,但是我没有看到如何为它提供默认值。例:

base.add_options()
 ("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
Run Code Online (Sandbox Code Playgroud)

可以很好地将值读入vecoptions之类的东西

    base.add_options()
 ("int_value",po::value<int>(&intoption)->default_value(1),"description");
Run Code Online (Sandbox Code Playgroud)

也可以正常工作,但是尝试为vector参数赋予默认值,例如in

base.add_options()
 ("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
Run Code Online (Sandbox Code Playgroud)

给出编译器错误

错误:静态断言失败:源类型既不是std :: ostream`able也不是std :: wostream`able

如何创建具有默认值(如{0,1,2})的向量值float选项?

c++ boost-program-options

5
推荐指数
1
解决办法
2139
查看次数