升压程序选项中的互斥选项集
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 正朝着这个方向前进,但步伐缓慢。以上是关于升压程序选项中的互斥选项集的主要内容,如果未能解决你的问题,请参考以下文章
Python argparse 与 stdin 互斥是选项之一