【问题标题】:boost program options choices提升程序选项选择
【发布时间】:2012-07-02 10:38:01
【问题描述】:

有没有一种简单的方法来检查选项的参数是否在一组预定义的选项中?这里的“简单”意味着不定义临时类。

假设我有选项--myoption,它的值必须是"myvalue1""myvalue2"

例如在 python 中使用choices option in optparse 真的很容易

【问题讨论】:

  • 这不只是比较字符串吗?假设他们都是std::string,你可以做if ((arg == myvalue1) || (arg == myvalue2))
  • 当然,它可以工作,但我需要在program-options 中更集成的东西(例如它可以更改帮助消息),例如使用非字符串
  • 你可能想解释更多关于你想做什么,不清楚。
  • @JesseGood:很简单,我希望如果用户输入--myoption myvalue3,程序应该引发异常。

标签: c++ boost-program-options command-line-arguments


【解决方案1】:

正如我刚刚意识到的,您可以定义两个互斥选项,只需定义一个小函数,如 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()之后

检查--myoption 是否等于myvalue1myvalue2 然后只需一个函数调用即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多