Question

J'utilise la bibliothèque boost :: program_options pour traiter les paramètres de ligne de commande. J'ai besoin d'accepter un nom de fichier via l'option -r, au cas où il est vide (-r donné sans paramètre), il faut que j'utilise stdin.

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")

Dans ce cas, boost n’accepterait pas -r sans params et lèverait une exception. L'option default_value () ne fonctionne pas aussi bien qu'elle donnerait une valeur de retour à la bibliothèque même si l'utilisateur n'a pas donné l'option -r.

Des idées sur la façon de contourner le problème?

Était-ce utile?

La solution

Veuillez utiliser la méthode implicit_value , par exemple

.
desc.add_options()
 ("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")

Cela permet à l'option d'accepter le jeton 0 ou 1, et si aucun jeton n'est fourni, il agira comme si 'stdin' était fourni. Bien sûr, vous pouvez choisir n’importe quelle autre valeur implicite, y compris une chaîne vide et un "-" comme suggéré par mch.

Autres conseils

Vous pouvez essayer une astuce avec les options multitoken et zero_tokens :

using namespace std;
namespace po = boost::program_options;

vector<string> replay;

po::options_description desc("Allowed options");
desc.add_options()
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla");

po::variables_map vm;        
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);    

if (vm.count("replay"))
{
  size_t s = vm["replay"].as< vector<string> >().size();
  if (s == 0)
    cout << "replay without args" << endl;
  else if (s == 1)
    cout << "replay with one arg" << endl;
  else
    cout << "replay with multiple args" << endl;
}
else
  cout << "replay not specified" << endl;

Ensuite, comptez simplement le nombre d'éléments dans le vecteur replay . Vous voudrez renvoyer une erreur si plusieurs arguments sont passés à l'option replay .

Je ne pense pas que les bibliothèques d’analyse de ligne de commande vous permettent d’avoir des options pouvant accepter un argument ou non. Si une option nécessite un argument, vous devez en donner un. Dans ce cas, la pratique standard (dans * NIX en tout cas) consiste à utiliser "-" comme nom de fichier pour indiquer que vous souhaitez lire à partir de l'entrée standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top