2010-02-08 15 views
7

Escribí una pequeña aplicación que utiliza boost :: program_options para el análisis de línea de comandos. Me gustaría tener algunas opciones que establezcan un valor si el argumento está presente, e imprime alternativamente el valor actual si el parámetro está dado pero no hay ningún argumento presente. Por lo que "en modo ajuste" se vería así:Parámetros con y sin argumentos en boost :: opciones_programa

dc-ctl --brightness 15 

y "modo de conseguir" sería:

dc-ctl --brightness 
brightness=15 

El problema es que no sé cómo manejar el segundo caso sin coger este excepción:

error: required parameter is missing in 'brightness' 

¿hay una manera fácil de evitar tener que tirar ese error? Sucede tan pronto como se analicen los argumentos.

Respuesta

4

Obtuve una solución parcial de How to accept empty value in boost::program_options que sugiere usar el método implicit_value en aquellos parámetros que pueden tener o no argumentos presentes. Así que mi llamada para inicializar el parámetro de "brillo" se parece a esto:

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

entonces iterar sobre el mapa variable y para cualquier argumento de que es una cadena, puedo comprobar si está vacío y si es así puedo imprimir el valor actual . Ese código es el siguiente:

// 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; 
    } 

ACTUALIZACIÓN: esto cambia la sintaxis anterior, cuando se utilizan los valores implícitos, ahora argumentos, cuando se dan, debe ser de la forma:

./dc-ctl -b500 

en lugar de

./dc-ctl -b 500 

Espero que esto sea útil para otra persona.

Cuestiones relacionadas