【问题标题】:Boost program options setting min and max value for optionBoost 程序选项设置选项的最小值和最大值
【发布时间】:2014-10-22 06:34:27
【问题描述】:

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

opt::value<unsigned short>()->default_value(5)

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

【问题讨论】:

    标签: c++ boost max minimum boost-program-options


    【解决方案1】:

    我推荐一个 lambda(比如kaveish'sanswer)。但是您可以让它返回一个检查适当边界的函数,以使所有内容更具可读性。

    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"));
    

    【讨论】:

    • 我非常喜欢这个解决方案。稍作调整 - 我将 in 设为模板函数,其类型为 minmaxv 作为模板参数。
    【解决方案2】:

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

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

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

    throw opt::validation_error(
      opt::validation_error::invalid_option_value,
      "option_name",
      std::to_string(value));
    

    【讨论】:

      【解决方案3】:

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

      opt::value<unsigned short>()->default_value(5)->notifier(&check_function);
      

      检查功能类似于

      void check(unsigned short value)
      {
         if (value < 0 || value > 10)
         {
            // throw exception
         }
      }
      

      或更笼统的

      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));
      

      【讨论】:

      • 您似乎不能使用它来检查输入是否超出该类型的范围,例如将 -1 传递给 value&lt;unsigned&gt; 仍然作为 4294967295 传递给通知函数,除非非常小心地将类型“转换”回某物。理想情况下,我希望任何超出指定类型范围的输入都失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多