【问题标题】:How to have an optional option value in boost program options?如何在 boost 程序选项中有一个可选的选项值?
【发布时间】:2015-08-10 13:44:01
【问题描述】:

我正在使用 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\

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

【问题讨论】:

    标签: c++ boost boost-program-options


    【解决方案1】:

    您可以通过同时为value 提供default_valueimplicit_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
    

    【讨论】:

    • 最新的Boost-1.59 改变了这种行为。如果定义implicit_valuedefault_value,则不能设置值,例如--argument 3。如果添加--argument,则使用隐式值。如果不是,则使用默认值。另外:如果只定义了implicit_value而参数不存在,则参数值是未定义的。
    • 虽然文档多年来一直这么说,并且代码“仅”固定以匹配文档,但我愿意接受在其他方向更改文档和代码的论点。如果你愿意,在 github 上打开一个问题是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多