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

How to have an optional option value in boost program options?

本文关键字:选项 拥有 boost 程序      更新时间:2023-10-16

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

  1. 如果没有定义
  2. 如果已定义但没有值
  3. 如果用值
  4. 定义

例如,我有一个程序可以处理一个文件,如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

我如何用Boost程序选项做到这一点?

您可以通过同时赋予value一个default_value和一个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;
    }
}

运行这个示例代码打印:

$ ./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