使用程序选项,我正在检查有效的参数组合。但由于某种原因,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
答案 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()
,则无法将其关闭......