升压程序选项中的互斥选项集

Posted

技术标签:

【中文标题】升压程序选项中的互斥选项集【英文标题】:Sets of mutually exclusive options in boost program options 【发布时间】:2013-03-12 17:00:54 【问题描述】:

我的程序 (prog.exe) 支持以下四个标志:-P-p-b-s。然而:

-b-p 必须一起指定,构成一个集合,并具有数值,例如-b 42 -s不能与上面的集合一起指定,反之亦然 -P 在这两种情况下都是必需的

因此,prog.exe 只能作为其中之一运行

prog.exe -P -s 

prog.exe -P -b -42 -p 8

有没有办法在boost程序选项中指定上述一组互斥的命令行选项?

【问题讨论】:

这是在boost::program_options 客户端应用程序恕我直言的(强制)parseOptions() 方法中实现的逻辑的一部分。 我遇到过这种情况,通常将它们映射到一些“程序执行模式”枚举选项。我首先为此查找选项设置,确定后,继续执行特定选项... 【参考方案1】:

您应该从一些教程开始 [1][2] 以了解 boost::program_options 的工作原理。

然后,您可以定义两个互斥选项,只需定义一个小函数,如real.cpp 中所述。例如,您可以指定定义 conflicting_options() 函数的两个冲突(或依赖)选项:

void conflicting_options(const boost::program_options::variables_map & vm,
                         const std::string & opt1, const std::string & opt2)

    if (vm.count(opt1) && !vm[opt1].defaulted() &&
        vm.count(opt2) && !vm[opt2].defaulted())
    
        throw std::logic_error(std::string("Conflicting options '") +
                               opt1 + "' and '" + opt2 + "'.");
    

然后调用

conflicting_options (vm, "quiet", "verbose");

就在boost::program_options::store()之后

我仍然不明白是否可以定义两个相互排斥的位置选项,但这应该是另一个问题。

【讨论】:

在我看来,它的样板代码太多了!为什么不支持像 python 的 argparse 这样的互斥组呢? Python 几乎总是比 C++ 更简洁,一直如此。 C++11/14/17 正朝着这个方向前进,但步伐缓慢。

以上是关于升压程序选项中的互斥选项集的主要内容,如果未能解决你的问题,请参考以下文章

具有互斥必需参数的命令行解析器

js解决下拉列表框互斥选项的问题

Python argparse 与 stdin 互斥是选项之一

C++ 线程安全对象缓存的设计选项

如何更改 Visual Studio 10 中的编译器选项?

Dynamics CRM EXCEL导入数据字段类型为选项集时的注意事项