2010-02-08 12 views
7

J'ai écrit une petite application qui utilise boost :: program_options pour l'analyse en ligne de commande. Je voudrais avoir des options qui définissent une valeur si l'argument est présent, et imprime alternativement la valeur courante si le paramètre est donné mais aucun argument n'est présent. Ainsi, "set-mode" ressemblerait à ceci:Paramètres avec et sans arguments dans boost :: options_programme

dc-ctl --brightness 15 

et le "mode get" serait:

dc-ctl --brightness 
brightness=15 

Le problème est, je ne sais pas comment gérer le second cas sans attraper cette exception:

error: required parameter is missing in 'brightness' 

Existe-t-il un moyen facile d'éviter que cette erreur ne se produise? Cela arrive dès que les arguments sont analysés.

Répondre

4

J'ai obtenu une solution partielle de How to accept empty value in boost::program_options qui suggère d'utiliser la méthode implicit_value sur les paramètres qui peuvent avoir ou non des arguments présents. donc mon appel pour initialiser le paramètre « luminosité » ressemble à ceci:

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

J'itérer puis sur la carte variable et pour tout argument qui est une chaîne, je vérifie si elle est vide et si oui imprimer la valeur actuelle . Ce code ressemble à ceci:

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

MISE À JOUR: cela change la syntaxe ci-dessus, lors de l'utilisation des valeurs implicites, maintenant des arguments, lorsqu'il est donné, doit être de la forme:

./dc-ctl -b500 

au lieu de

./dc-ctl -b 500 

Espérons que cela soit utile à quelqu'un d'autre.