Arguments obligatoires et Facultatifs à l'Aide de Bibliothèque Boost Options du Programme
Je suis en utilisant le Programme Boost Options de la Bibliothèque pour analyser les arguments de ligne de commande.
J'ai les exigences suivantes:
- Une fois "aide" est fourni, toutes les autres options sont facultatives;
- Une fois "aide" n'est pas fourni, toutes les options sont nécessaires.
Comment je peux faire face à cela? Voici mon code de la manipulation, et j'ai trouvé que c'est très redondant, et je pense qu'il doit être facile à faire, non?
#include <boost/program_options.hpp>
#include <iostream>
#include <sstream>
namespace po = boost::program_options;
bool process_command_line(int argc, char** argv,
std::string& host,
std::string& port,
std::string& configDir)
{
int iport;
try
{
po::options_description desc("Program Usage", 1024, 512);
desc.add_options()
("help", "produce help message")
("host,h", po::value<std::string>(&host), "set the host server")
("port,p", po::value<int>(&iport), "set the server port")
("config,c", po::value<std::string>(&configDir), "set the config path")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("help"))
{
std::cout << desc << "\n";
return false;
}
//There must be an easy way to handle the relationship between the
//option "help" and "host"-"port"-"config"
if (vm.count("host"))
{
std::cout << "host: " << vm["host"].as<std::string>() << "\n";
}
else
{
std::cout << "\"host\" is required!" << "\n";
return false;
}
if (vm.count("port"))
{
std::cout << "port: " << vm["port"].as<int>() << "\n";
}
else
{
std::cout << "\"port\" is required!" << "\n";
return false;
}
if (vm.count("config"))
{
std::cout << "config: " << vm["config"].as<std::string>() << "\n";
}
else
{
std::cout << "\"config\" is required!" << "\n";
return false;
}
}
catch(std::exception& e)
{
std::cerr << "Error: " << e.what() << "\n";
return false;
}
catch(...)
{
std::cerr << "Unknown error!" << "\n";
return false;
}
std::stringstream ss;
ss << iport;
port = ss.str();
return true;
}
int main(int argc, char** argv)
{
std::string host;
std::string port;
std::string configDir;
bool result = process_command_line(argc, argv, host, port, configDir);
if (!result)
return 1;
//Do the main routine here
}
InformationsquelleAutor Peter Lee | 2011-03-22
Vous devez vous connecter pour publier un commentaire.
J'ai rencontrer ce genre de problème moi-même. La clé d'une solution est que la fonction
po::store
remplit lavariables_map
toutpo::notify
soulève toutes les erreurs, de sortevm
peut être utilisé avant toute notification envoyée.Donc, comme par Tim, réglez chaque option obligatoire, comme souhaité, mais de l'exécuter
po::notify(vm)
après vous avez fait affaire avec l'aide de l'option. De cette façon, il sera à la sortie, sans aucune exception levée. Maintenant, avec les options nécessaires, une option manquante entraînera unerequired_option
exception levée et à l'aide de songet_option_name
méthode, vous pouvez réduire votre code d'erreur relativement simplecatch
bloc.Comme une note complémentaire, votre option variables sont définies directement via le
po::value< -type- >( &var_name )
mécanisme, de sorte que vous n'avez pas accès parvm["opt_name"].as< -type- >()
.Ici est le programme complet comme par rcollyer et Tim, dont les crédits vont à:
boost::program_options::required_option
de sorte que vous pouvez gérer l'absence d'une option obligatoire directement au lieu de l'avoir attrapé parstd::exception
.Vous pouvez spécifier qu'une option est requise assez facilement [Un], par exemple,:
mais autant que je sache, il n'y a pas moyen de représenter les relations entre les différentes options pour la program_options de la bibliothèque.
Une possibilité consiste à analyser la ligne de commande plusieurs fois avec différentes option définit, ensuite, si vous avez déjà vérifié pour "aide" vous pouvez analyser avec les trois autres options que celles requises. Je ne suis pas sûr que je serais considéré une amélioration par rapport à ce que vous avez, si.
->required()
, mais l'utilisateur ne peut pas obtenir les informations d'aide par--help
(sans fournir toutes les autres options), parce que d'autres options sont nécessaires.