2010-02-08 159 views
7

我寫了一個使用boost :: program_options進行命令行解析的小應用程序。 我想有一些選項可以設置一個值,如果參數存在,並交替打印當前值,如果參數給出但沒有參數存在。因此,「設置模式」看起來像:boost :: program_options中帶參數和不帶參數的參數

dc-ctl --brightness 15 

和「獲取模式」將是:

dc-ctl --brightness 
brightness=15 

的問題是,我不知道如何處理第二種情況下沒有抓住這個例外:

error: required parameter is missing in 'brightness' 

有沒有簡單的方法來避免它拋出那個錯誤?一旦參數被解析,它就會發生。

回答

4

我從How to accept empty value in boost::program_options得到了部分解決方案,它建議在那些可能有或沒有參數的參數上使用implicit_value方法。 所以,我呼籲初始化「亮度」參數是這樣的:

("brightness,b", po::value<string>()->implicit_value(""), 

然後我迭代變量圖和這是一個字符串的任何說法,我檢查它是否是空的,如果是這樣我打印的當前值。該代碼看起來是這樣的:

// check if we're just printing a feature's current value 
    bool gotFeature = false; 
    for (po::variables_map::iterator iter = vm.begin(); iter != vm.end(); ++iter) 
    { 
     /// parameter has been given with no value 
     if (iter->second.value().type() == typeid(string)) 
      if (iter->second.as<string>().empty()) 
      { 
       gotFeature = true; 
       printFeatureValue(iter->first, camera); 
      } 
    } 

    // this is all we're supposed to do, time to exit 
    if (gotFeature) 
    { 
     cleanup(dc1394, camera, cameras); 
     return 0; 
    } 

UPDATE:這改變了上述語法,使用隱式的價值觀,現在爭論的時候,給的時候,一定是這樣的形式:

./dc-ctl -b500 

,而不是

./dc-ctl -b 500 

希望這對別人有幫助。