Erforderliche und optionale Argumente unter Verwendung der Boost Library-Programmoptionen
Ich bin mit Boost-Programm-Optionen-Bibliothek zum Parsen der Kommandozeilenparameter.
Habe ich folgende Anforderungen:
- Einmal "Hilfe" ist vorgesehen, alle anderen Optionen sind optional;
- Einmal "Hilfe" ist nicht vorgesehen, alle anderen Optionen sind erforderlich.
Wie kann ich damit umgehen? Hier ist mein code der Umgang mit diesem, und ich fand es sehr überflüssig, und ich denke, es muss einfach zu tun, richtig?
#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 der Frage Peter Lee | 2011-03-22
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich dieses Problem mich. Der Schlüssel zu einer Lösung ist, dass die Funktion
po::store
füllt dievariables_map
währendpo::notify
wirft Fehler, sovm
verwendet werden können, vor jeder-Benachrichtigungen gesendet werden.So, wie pro Timstellen Sie jede option benötigt, wie gewünscht, aber ausgeführt
po::notify(vm)
nachdem Sie befasste sich mit der help-option. Auf diese Weise wird es beendet, ohne irgendwelche Ausnahmen. Jetzt, mit der Optionen erforderlich, eine fehlende option bewirkt, dass einrequired_option
Ausnahme geworfen werden und mit seinerget_option_name
- Methode reduzieren Sie Ihren Fehler-code, um eine relativ einfachecatch
block.Als zusätzlicher Hinweis, die option Variablen werden direkt über die
po::value< -type- >( &var_name )
Mechanismus, so dass Sie nicht haben, um Ihnen den Zugang durchvm["opt_name"].as< -type- >()
.InformationsquelleAutor der Antwort rcollyer
Hier ist das komplette Programm als pro rcollyer und Tim, wen die credits gehen an:
InformationsquelleAutor der Antwort Peter Lee
Können Sie festlegen, dass eine option erforderlich ist leicht genug [Eins], z.B.:
aber soweit ich weiß, gibt es keine Methode zur Darstellung von Beziehungen zwischen verschiedenen Optionen, um die program_options Bibliothek.
Eine Möglichkeit ist zum Parsen der Kommandozeile mehrere Male mit verschiedenen option setzt, dann haben Sie bereits geprüft "Hilfe" können Sie analysieren, wieder mit den drei anderen Optionen wie gewünscht eingestellt. Ich bin mir nicht sicher, würde ich prüfen, die eine Verbesserung gegenüber dem, was Sie haben, aber.
InformationsquelleAutor der Antwort Tim Sylvester
InformationsquelleAutor der Antwort Edgard Lima