【问题标题】:Boost Program Options bool always TrueBoost 程序选项 bool 始终为 True
【发布时间】:2015-11-15 23:36:21
【问题描述】:

使用程序选项,我正在检查参数的有效组合。但由于某种原因,gpu 参数是一个布尔值,无论我在命令行上是否将其设置为 false,它始终为 true。如果我在命令行上指定了 gpu 选项,有没有办法让它为假?我希望能够创建一个 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 << var2 << " is not active " << std::endl;

输出:

$./a.out -r xx -u off
remove is active 
gpu is active
$./a.out -r xx -u false
remove is active 
gpu is active

【问题讨论】:

  • bool_switch docs:“与 'value' 函数的工作方式相同,但创建的 value_semantic 不会接受任何显式值。因此,如果该选项存在于命令中行,值将是 'true'。"

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


【解决方案1】:

您使用的是bool_switch。默认情况下,该选项将是 false,就像您使用 -&gt;default_value(false) 指定的一样。由于它是一个开关,当您运行可执行文件时,仅存在-u--gpu 就会将开关切换到true。后面放什么都没关系。

查看this answer了解更多使用详情。

【讨论】:

    【解决方案2】:

    对于 bool_switch,似乎 (*) count() 始终为 1。 因此不应该使用:

    bool help           = vm.count("help");
    

    但改为使用:

    bool help           = vm["help"].as<bool>();
    

    或为“安全”(*):

    bool help           = vm.count("help") ? vm["help"].as<bool>() : false;
    

    (*) 深入研究文档应该可以准确地说明做事的确切和确定方式。

    【讨论】:

      【解决方案3】:

      虽然没有直接回答 OP 的问题,但我认为这是一个重要的说明。根据 boost program_options 规范spec,无论您的默认值是什么,当您从命令行指定选项时,它总是将开关切换到true

      因此,如果您将default_value(true) 用于bool_switch(),则无法真正将其关闭...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多