C++ 增强程序选项设置选项的最小值和最大值
是否可以设置值的最小和最大限制(假设它是无符号短的,我需要一个介于0和10之间的值),因为我可以通过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
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传递给通知程序函数,除非非常小心地使用类型将其“转换”回某个对象。最佳情况下,我希望在任何超出指定类型范围的输入上失败。