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

Olu*_*ide 18 c++ command-line-arguments boost-program-options command-line-parsing

我的计划(prog.exe)支持以下四个标志:-P,-p,-b-s.然而:

  • -b并且-p必须一起指定,构成一个集合,并具有数值,例如-b 42
  • -s 不能用上面的集合指定,反之亦然
  • -P 两种情况都是强制性的

因此,prog.exe只能作为两者运行

prog.exe -P -s 
Run Code Online (Sandbox Code Playgroud)

要么

prog.exe -P -b -42 -p 8
Run Code Online (Sandbox Code Playgroud)

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

Avi*_*vio 22

你应该从一些教程[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 + "'.");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话

conflicting_options (vm, "quiet", "verbose");
Run Code Online (Sandbox Code Playgroud)

之后 boost::program_options::store()

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

  • 在我看来,它是如此多的样板代码!为什么不能提升像python的argparse那样支持互斥的群体呢? (3认同)