Boost程序选项选择

5

有没有一种简单的方法来检查选项参数是否在预定义的选择集合内?这里的“简单”意味着不需要定义一个临时类。

假设我有一个选项--myoption,它必须具有值"myvalue1""myvalue2"

例如,在Python中使用 optparse 中的 choices 选项非常容易。


1
这不就是比较字符串吗?假设它们都是 std::string 类型,你可以这样写:if ((arg == myvalue1) || (arg == myvalue2)) - Jesse Good
你可能需要更详细地解释你想做什么,现在还不太清楚。 - Jesse Good
@JesseGood:非常简单,如果用户输入 --myoption myvalue3,程序应该引发异常。 - Ruggero Turra
可能是Boost程序选项允许输入值的集合的重复。 - Ruggero Turra
可能是 Sets of mutually exclusive options in boost program options 的重复问题。 - Uli Köhler
显示剩余2条评论
1个回答

0

正如我刚刚意识到的那样,你可以通过定义一个小函数来定义两个互斥的选项,就像在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 现在只是一个函数调用的问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接