2015-08-10 6 views
6

Ich bin mit der Boost-Option Programm und ich möchte eine Option anbieten, die drei Möglichkeiten haben:Wie haben Sie einen optionalen Optionswert in den Boost-Programmoptionen?

  1. Wenn nicht
  2. definieren Wenn definiert, aber keinen Wert
  3. Wenn mit einem Wert definiert

Zum Beispiel habe ich ein Programm, das auf eine Datei wie a.jpg funktioniert, und ich möchte den Benutzer bieten, um es in den folgenden Szenarien verwenden zu können:

myapp.exe a.jpg : process jpeg 
myapp.exe a.jpg -e : process jpeg and generate report at the same directory as a.jpg 
myapp.exe a.jpg -e c:\tmp\ : process jpeg and generate report at c:\tmp\ 

Wie kann ich das mit den Boost-Programmoptionen machen?

Antwort

9

Sie können diesen Effekt erreichen, indem Sie dem value sowohl einen default_value als auch einen implicit_value geben.

Die default_value wird verwendet, wenn die Option überhaupt nicht angegeben ist. Die implicit_value wird verwendet, wenn die Option spezifisch ohne einen Wert ist. Wenn ein Wert angegeben ist, überschreibt es den Standardwert und implizit.

einige Code Also, dies zu tun könnte wie folgt aussehen:

#include "boost/program_options.hpp" 
#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    namespace po = boost::program_options; 

    po::options_description desc("Options"); 
    desc.add_options() 
     ("process-jpeg,e", po::value<string>()->default_value("")->implicit_value("./"), "Processes a JPEG."); 

    po::variables_map vm; 
    try 
    { 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 
    } catch (po::error& e) { 
     cerr << "ERROR: " << e.what() << endl << endl << desc << endl; 
     return 1; 
    } 

    string outputDir = vm["process-jpeg"].as<string>(); 
    if (outputDir.empty()) { 
     cout << "-e was not provided on the command line" << endl; 
    } else { 
     cout << "-e is using directory: " << outputDir << endl; 
    } 
} 

Ausführen dieses Beispielcode druckt:

$ ./jpg_processor 
-e was not provided on the command line 

$ ./jpg_processor -e 
-e is using directory: ./ 

$ ./jpg_processor -e c:\tmp 
-e is using directory: c:\tmp 
+0

Nizza und prägnant. Ich habe eine Sache gelernt :) – sehe

+1

Latest [Boost-1.59] (http://www.boost.org/users/history/version_1_59_0.html) ändert dieses Verhalten. Wenn Sie 'implicit_value' und' default_value' definieren, können Sie den Wert z. B. '--argument 3' nicht setzen. Wenn Sie '--argument' hinzufügen, wird ein impliziter Wert verwendet. Wenn nicht, wird der Standardwert verwendet. Auch: Wenn nur 'implicit_value' definiert ist und das Argument nicht existiert, ist der Argumentwert nicht definiert. –

+0

Während dies in der Dokumentation schon seit Jahren der Fall war und der Code "nur" so angepasst wurde, dass er der Dokumentation entsprach, wäre ich offen für Argumente, um sowohl Dokumente als auch Code in die anderen Richtungen zu ändern. Ein Problem bei Github zu öffnen wäre der beste Ansatz, wenn Sie möchten. –