C++ Boost程序选项允许一组输入值

C++ Boost程序选项允许一组输入值,c++,boost-program-options,C++,Boost Program Options,有没有办法为参数设置一组允许的输入变量?例如,参数“arg”只能有像“cat”和“dog”这样的字符串值。我浏览了Boost.Program\u options文档,我根本不清楚您是否可以这样做。我得到的印象是,该库主要负责解析命令行,而不是验证它。您可能能够使用,但这涉及到当您得到错误输入时抛出异常(这可能是一个比您想要的更严重的错误)。我认为该功能更适合于确保您实际上得到了一个字符串,而不是“猫”或“狗” 我能想到的最简单的解决方案是让库正常解析命令行,然后稍后添加您自己的代码以验证--ar

有没有办法为参数设置一组允许的输入变量?例如,参数“arg”只能有像“cat”和“dog”这样的字符串值。

我浏览了Boost.Program\u options文档,我根本不清楚您是否可以这样做。我得到的印象是,该库主要负责解析命令行,而不是验证它。您可能能够使用,但这涉及到当您得到错误输入时抛出异常(这可能是一个比您想要的更严重的错误)。我认为该功能更适合于确保您实际上得到了一个字符串,而不是“猫”或“狗”

我能想到的最简单的解决方案是让库正常解析命令行,然后稍后添加您自己的代码以验证
--arg
是否设置为
cat
dog
。然后,您可以打印错误并退出,恢复到适当的默认值,或者您喜欢的任何内容。

您可以使用该功能。为您的选项定义不同的类型,然后在该类型上重载
validate
函数

struct catdog {
  catdog(std::string const& val):
    value(val)
  { }
  std::string value;
};

void validate(boost::any& v, 
              std::vector<std::string> const& values,
              catdog* /* target_type */,
              int)
{
  using namespace boost::program_options;

  // Make sure no previous assignment to 'v' was made.
  validators::check_first_occurrence(v);

  // Extract the first string from 'values'. If there is more than
  // one string, it's an error, and exception will be thrown.
  std::string const& s = validators::get_single_string(values);

  if (s == "cat" || s == "dog") {
    v = boost::any(catdog(s));
  } else {
    throw validation_error(validation_error::invalid_option_value);
  }
}

我已经编写了一个。

一个非常简单的方法是将“animal”作为一个普通字符串,然后通知您测试并在需要时抛出

if (vm.count("animal") && (!(animal == "cat" || animal == "dog")))
        throw po::validation_error(po::validation_error::invalid_option_value, "animal");

这不正是Michael的建议吗?@RobKennedy,除了Michael说“这是你能做的”,而jorgen说“这是你能做的,这是它的样子”这个例子看起来非常类似于。但是,您也需要实现一个提取操作符函数
std::istream&operator>>(std::istream&in,catdog&cd)
{
>in.value;
}
`Yes,@Russoue,我的代码直接从我之前链接的文档中改编而来。不过,我不知道为什么您认为代码需要流提取。我已经包括了一个证明你的说法的工作实例。该文档使用
词法转换
将输入字符串转换为所需的数据类型,如果您想使用相同的技术,则确实需要实现
操作符>
。不过,我的示例使用直接构造。如何从字符串创建自定义类型超出了这个问题的范围。
if (vm.count("animal") && (!(animal == "cat" || animal == "dog")))
        throw po::validation_error(po::validation_error::invalid_option_value, "animal");