2015-08-21 66 views
4

使用程序選項,我正在檢查參數的有效組合。但出於某種原因,gpu參數是一個布爾值,並且無論在命令行中將其設置爲false,它總是如此。如果我在命令行中指定了gpu選項,那麼有沒有辦法讓gpu選項失效?我希望能夠創建一個bool變量來表示是否使用了命令行上的選項。Boost程序選項bool always True

另外,我找不到有關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 
+2

'bool_switch'文檔:「工作方式‘價值’的功能相同,但創建value_semantic將不接受任何明確的值,所以,如果選項出現在命令行上,值。將是'真實'。「 – chris

回答

5

您使用的是bool_switch。默認情況下,該選項將是false,就像您在->default_value(false)中指定的一樣。由於它是一個開關,當您運行可執行文件時僅僅存在-u--gpu會將開關切換爲true。不管你在之後放置什麼。

有關更多使用細節,請參閱this answer

+0

謝謝你,明白了! –

0

看來(*)count()對於bool_switch總是1。 因此,人們不應該使用:

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

而是使用:

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

或爲 「安全」(*):

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

(*)鑽研文檔應該告訴到底什麼是確切的和確定的做事方式。

0

儘管沒有直接回答OP的問題,但我認爲這是一個重要的說明。依據升壓program_options規範spec,不管你的默認值是什麼,當你從指定命令行選項讓它一直交換機true

所以如果你使用default_value(true)bool_switch(),你真的不能把它關掉...