Boost程序选项bool始终为True

时间:2015-08-21 22:36:29

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

使用程序选项,我正在检查有效的参数组合。但由于某种原因,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 << 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

3 个答案:

答案 0 :(得分:5)

您正在使用bool_switch。默认情况下,该选项与您false指定的->default_value(false)类似。由于它是一个切换,因此当您运行可执行文件时,只有-u--gpu的存在会将切换转为true。你把它放在后面并不重要。

有关更多使用详情,请参阅this answer

答案 1 :(得分:1)

对于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;

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

答案 2 :(得分:1)

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

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