C++ 增强程序选项设置选项的最小值和最大值

C++ 增强程序选项设置选项的最小值和最大值,c++,boost,max,minimum,boost-program-options,C++,Boost,Max,Minimum,Boost Program Options,是否可以设置值的最小和最大限制(假设它是无符号短的,我需要一个介于0和10之间的值),因为我可以通过 opt::value<unsigned short>()->default_value(5) opt::value()->默认值(5) 我想立即使用程序选项的变量映射中给出的参数,而不必检查每个参数。不,不能。 描述了所有选项。您可以手动检查它们,也可以编写将手动检查它们的函数 opt::value<unsigned short>()->default_v

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

opt::value<unsigned short>()->default_value(5)
opt::value()->默认值(5)
我想立即使用程序选项的变量映射中给出的参数,而不必检查每个参数。

不,不能。 描述了所有选项。您可以手动检查它们,也可以编写将手动检查它们的函数

opt::value<unsigned short>()->default_value(5)->notifier(&check_function);
opt::value()->default_值(5)->通知程序(&check_函数);
其中check函数类似于

void check(unsigned short value)
{
   if (value < 0 || value > 10)
   {
      // throw exception
   }
}
throw opt::validation_error(
  opt::validation_error::invalid_option_value,
  "option_name",
  std::to_string(value));
无效检查(无符号短值)
{
如果(值<0 | |值>10)
{
//抛出异常
}
}
还是更一般

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));
模板
无效检查范围(常数T和值、常数T和最小值、常数T和最大值)
{
如果(值<最小值>最大值)
{
//抛出异常
}
}
opt::value()->默认值(5)->通知程序
(boost::绑定(&check_range,_1,0,10));

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

opt::value<unsigned short>()
  ->default_value(5)
  ->notifier(
      [](std::size_t value)
      {
        if (value < 0 || value > 10) {
          // throw exception
        }
      })
我推荐一辆兰姆达(像)。但您可以让它返回一个函数,该函数检查适当的边界,以使所有内容更具可读性

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"));
auto-in=[](int-min,int-max,char-const*const-opt_-name){
返回[opt_name,min,max](无符号短v){
如果(vmax){
抛出opt::验证错误
(opt::validation\u error::无效的\u选项\u值,
opt_name,std::to_string(v));
}
};
};
opt::value()->默认值(5)
->通知者(在(0,10,“我的选择”);

我非常喜欢这个解决方案。一次小的调整-我在中创建了一个模板函数,其类型为
min
max
、和
v
,作为模板参数。似乎你不能用它来检查输入是否超出该类型的范围,例如,将-1传递给
仍然作为4294967295传递给通知程序函数,除非非常小心地使用类型将其“转换”回某个对象。最佳情况下,我希望在任何超出指定类型范围的输入上失败。