提升程序选项设置选项的最小值和最大值

Vic*_*voy 8 c++ boost max minimum boost-program-options

是否可以设置一个值的最小和最大限制(假设它是无符号短,我需要一个0到10之间的值)因为我可以设置默认值

opt::value<unsigned short>()->default_value(5)
Run Code Online (Sandbox Code Playgroud)

我想立即使用从程序选项的变量映射给出的参数而不检查它们中的每一个.

Epo*_*ous 10

我推荐一个lambda(就像kaveish的 答案).但是你可以让它返回一个函数来检查相应的边界,使一切更具可读性.

auto in = [](int min, int max, char const * const opt_name){
  return [opt_name, min, max](unsigned short v){ 
    if(v < min || v > max){ 
      throw opt::validation_error
        (opt::validation_error::invalid_option_value,
         opt_name, std::to_string(v));
    }
  };
};

opt::value<unsigned short>()->default_value(5)
  ->notifier(in(0, 10, "my_opt"));
Run Code Online (Sandbox Code Playgroud)


For*_*veR 9

你不能.此处描述所有选项.您可以手动检查它们,也可以编写功能,以便手动检查它们.

opt::value<unsigned short>()->default_value(5)->notifier(&check_function);
Run Code Online (Sandbox Code Playgroud)

检查功能是什么样的

void check(unsigned short value)
{
   if (value < 0 || value > 10)
   {
      // throw exception
   }
}
Run Code Online (Sandbox Code Playgroud)

或者更一般

template<typename T>
void check_range(const T& value, const T& min, const T& max)
{
   if (value < min || value > max)
   {
      // throw exception
   }
}

opt::value<unsigned short>()->default_value(5)->notifier
(boost::bind(&check_range<unsigned short>, _1, 0, 10));
Run Code Online (Sandbox Code Playgroud)


kav*_*ish 8

在C++ 11中,这也可以使用lambda表达式来实现.

opt::value<unsigned short>()
  ->default_value(5)
  ->notifier(
      [](std::size_t value)
      {
        if (value < 0 || value > 10) {
          // throw exception
        }
      })
Run Code Online (Sandbox Code Playgroud)

这样可以方便地将验证代码本身保持在调用点附近,并允许您更轻松地自定义异常,例如

throw opt::validation_error(
  opt::validation_error::invalid_option_value,
  "option_name",
  std::to_string(value));
Run Code Online (Sandbox Code Playgroud)