【问题标题】:Poco Option with optional argument带有可选参数的 Poco 选项
【发布时间】:2021-03-01 14:01:16
【问题描述】:

我有一个基于 Poco (v1.9.4) 的课程

class PreprocessingApp : public Poco::Util::Application

使用这两种方法:

void PreprocessingApp::defineOptions(OptionSet& options)
{
    Application::defineOptions(options);

    options.addOption(
        Option("proxy", "p", "Proxify connection")
        .required(false)
        .repeatable(false)
        .argument("the value", false)
        .callback(OptionCallback<PreprocessingApp>(this, &PreprocessingApp::handleBooleanOption))
    );

    options.addOption(
        Option("test", "t", "Test something")
        .required(true)
        .repeatable(false)
        .callback(OptionCallback<PreprocessingApp>(this, &PreprocessingApp::handleBooleanOption))
    );
}

void PreprocessingApp::handleBooleanOption(const string& name, const string& value)
{
    bool actualValue = value.empty() | value == "true" | value == "1";
    config().setBool(name, actualValue);
}

如您所见,“代理”是一个布尔选项。我添加了 ".argument("the value", false)" 以允许使用此选项传递参数,但将 "required" 标记为 false 以使其可选。
这样我希望允许这个功能:

PreprocessingApp [-p [value]] -t [value]

两种变体都应该工作:

PreprocessingApp -p -t 
PreprocessingApp -p true -t

实际上,在调试handleBooleanOption时,“value”始终为空“”。
切换required为true(.argument("the value", true))时,"value"为"-t",省略next选项处理。

是否有任何解决方案使其按预期工作?

【问题讨论】:

    标签: c++ poco-libraries


    【解决方案1】:

    根据 Poco documentation:

    可以通过三种方式指定选项参数。如果 Unix 短 给出选项(“-o”),参数直接跟在选项名称后面, 没有任何分隔字符或空格(“-ovalue”)。在默认情况下 选项模式,或者如果给出了 Unix 长选项(“--option”),则 选项参数由选项名称分隔 符号 ('=') 或冒号 (':'),如 "--option=value" 或 “/option:value”。最后,可以指定一个必需的选项参数 在选项后面的命令行中,用空格分隔,如 “--选项值”或“-o 值”。后者仅适用于所需 选项参数,而不是可选参数。

    基本上,必填参数需要在名称和值之间有一个空格,而可选参数则不需要。因此,对于您的可选参数,请按如下方式指定:-ptrue--proxytrue--proxy:true

    对于必需的参数,这里还有另一个问题。您可能会认为使用 setter .required(true)Poco::Util::Option 足以在代码中定义所需的参数,但显然不是。您还必须使用 setter .argument(),默认情况下将 required 设置为 true:

    Option & argument(
        const std::string & name,
        bool required = true
    );
    

    因此,将所需参数的代码更改为:

    options.addOption(
        Poco::Util::Option("test", "t", "Test something")
            .required(true)
            .repeatable(false)
            .argument("test")
            .callback(Poco::Util::OptionCallback<ModbusInterface>(this, &ModbusInterface::handleBooleanOption))
        );
    

    那么你应该可以像这样调用你的应用程序,例如:

    PreprocessingApp -ptrue -t true
    

    【讨论】:

    • 我还可以提供用冒号分隔的必需参数吗?
    猜你喜欢
    • 2021-02-28
    • 2012-07-16
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多