如何在boost程序选项中有可选的选项值?

man*_*ans 11 c++ boost boost-program-options

我正在使用Boost程序选项,我想提供一个有三种方式的选项:

  1. 如果没有定义
  2. 如果定义但没有价值
  3. 如果定义了值

例如,我有一个程序可以处理a.jpg等文件,我想让用户能够在以下场景中使用它:

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\
Run Code Online (Sandbox Code Playgroud)

如何使用Boost程序选项执行此操作?

Sea*_*ine 18

你可以通过给出valuea default_value和a 来实现这种效果implicit_value.

default_value根本没有指定选项时将使用.在implicit_value当选项是不特定的值将被使用.如果一个值指定,它会覆盖默认的和隐性的.

所以,执行此操作的一些代码可能如下所示:

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此示例代码打印:

$ ./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
Run Code Online (Sandbox Code Playgroud)

  • 最新[Boost-1.59](http://www.boost.org/users/history/version_1_59_0.html)更改了此行为.如果定义`implicit_value`和`default_value`,则不能设置值,例如`--argument 3`.如果添加`--argument`,则使用隐式值.如果不是,则使用默认值.另外:如果只定义了`implicit_value`并且参数不存在,则参数值是未定义的. (2认同)