【发布时间】:2014-10-22 06:34:27
【问题描述】:
是否可以设置一个值的最小和最大限制(假设它是无符号短,我需要一个介于 0 和 10 之间的值),因为我可以设置默认值
opt::value<unsigned short>()->default_value(5)
我想立即使用从程序选项的变量映射中给出的参数,而不检查每个参数。
【问题讨论】:
标签: c++ boost max minimum boost-program-options
是否可以设置一个值的最小和最大限制(假设它是无符号短,我需要一个介于 0 和 10 之间的值),因为我可以设置默认值
opt::value<unsigned short>()->default_value(5)
我想立即使用从程序选项的变量映射中给出的参数,而不检查每个参数。
【问题讨论】:
标签: c++ boost max minimum boost-program-options
我推荐一个 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 设为模板函数,其类型为 min、max 和 v 作为模板参数。
在 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));
【讨论】:
不,你不能。 所有选项都描述了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));
【讨论】:
value<unsigned> 仍然作为 4294967295 传递给通知函数,除非非常小心地将类型“转换”回某物。理想情况下,我希望任何超出指定类型范围的输入都失败。