【问题标题】:Boost Program Options optional argument precedenceBoost Program Options 可选参数优先级
【发布时间】:2012-08-02 01:56:59
【问题描述】:

应用程序有两个选项:afilefile 是一个位置选项。 afile 都有一个字符串类型的参数,可以省略。 (我为两者都设置了一个隐含的空字符串)。

期望的行为如下:

  1. $ program -> file: ""

  2. $ program file.txt -> file: "file.txt"

  3. $ program --a -> a: "", file: ""

  4. $ program --a file.txt -> a: "", file: "file.txt"

  5. $ program --a x file.txt -> a: "x", file: "file.txt"

但是,选项 4 被解释为 a: "file.txt", file: ""。有什么方法可以告知 program_options 如何解决这种模棱两可的情况? ($ program --a -- file.txt 确实可以按预期工作,但我也希望在没有额外内容的情况下也能正常工作。)我目前使用空字符串表示“未指定”,但这不是必需的。

【问题讨论】:

    标签: boost-program-options


    【解决方案1】:

    我想说即使是用户也会对这种行为感到困惑,而不仅仅是 PO。 我不明白为什么我不能在没有file 的情况下指定--a,尤其是在文件具有隐含值的情况下?非强制位置选项的隐式空文件名的目的是什么?我想不出一个。

    您可以通过将解析器提供给 PO 来实现您的逻辑,文档中对此进行了描述。此外,最简单的方法是,如果未传递 file,您可以在解析后手动更改参数。

    【讨论】:

    • a 选项默认作用于所有条目,而参数允许过滤。 file 可以显式指定,但如果不是,程序将从配置文件中读取。
    • 如果a 选项值在逻辑上是足够的,为什么你让它隐含?根据您的说法,您允许用户将过滤器作为“”(无信息)传递,但我相信这是没有意义的。如果您不允许 a 的隐含值,您在 (4) 中的逻辑将被保留。
    • 不设置隐式空字符串会产生相同的结果。请注意,理想情况下,空字符串与“未指定”的值不同,我使用空字符串表示“未指定”。过滤器“”等于根本不过滤。
    【解决方案2】:

    如果a 是这样指定的,我通过手动将参数从a 移动到file 解决了这个问题:

    // Fix argument precedence
    if (!vm.count("file") && vm.count("a"))
    {
        vm.insert(std::make_pair("file", vm.at("a")));
        vm.at("a").as<std::string>() = std::string();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2013-11-12
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多