2010-02-08 125 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 

希望这对别人有帮助。