禁止使用boost::p rogram_options对无符号值进行负参数
Disallow negative argument for unsigned value with boost::program_options
假设我有一个使用 boost::p rogram_options 来解析命令行参数的程序,其中一个程序有一个unsigned
值:
#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
int main(int argc, char* argv[]) {
unsigned num;
po::options_description desc;
desc.add_options()
("num,n", po::value<unsigned>(&num), "Non-negative number");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
std::cout << "Number: " << num << 'n';
return 0;
}
然后,如果我在命令行上传递一个负值,它会接受它并将其包装起来:
$ ./bponeg -n -1人数: 4294967295
我宁愿负数触发错误(即抛出invalid_option_value
),就像我写./bponeg -n abc
一样。从解析后我自己的代码来看,似乎无法区分用户写-1
的情况或他们是否写4294967295
。
我可以指示program_options解析器拒绝unsigned
值的负输入吗?
您可以编写一个自定义验证器,如下所示:
struct nonnegative {
unsigned value;
};
void validate(boost::any& v, const std::vector<std::string>& values, nonnegative*, int)
{
using namespace boost::program_options;
validators::check_first_occurrence(v);
std::string const& s = validators::get_single_string(values);
if (s[0] == '-') {
throw validation_error(validation_error::invalid_option_value);
}
v = lexical_cast<unsigned>(s);
}
然后只使用nonnegative
而不是unsigned
.
但我认为只使用int64_t
并在负数时抛出错误会更容易。代码也更少。
相关文章:
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- C++如何将变量传递给带有无符号 int & 的参数uint16_t函数?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 模板参数可以既是 int 又可以是无符号长整型吗?
- 在与时间一起使用 srand 时,如果我没有time_t参数明确地将参数转换为无符号的 int 参数,这有关系吗?
- Variadic模板参数包只接受无符号int或size_t作为其类型
- 如何获得无符号的int作为控制台参数
- 使用 Boost.Python 使用无符号字符和参数公开方法
- 为什么丢弃的参数类型是无符号长长
- 推导出非类型模板参数无符号 int/size_t
- 当将负文字作为无符号参数传递时,可以g++警告
- C++:比较可变参数无符号 int 模板参数的帮助程序
- 禁止使用boost::p rogram_options对无符号值进行负参数
- 在编译模板方面,char、有符号char或无符号char参数类型的函数重载
- 在 x86-64 平台上为 C(++) 中的 64 位无符号参数计算 (a*b)%n FAST
- 有符号/无符号不匹配,并且函数在转换为函数时不带2个参数
- 在 C++11 中使函数模板参数无符号
- 无法将参数 1 从"cli::array<Type> ^"转换为"无符号短整型"
- C ++如何将我的命令行参数(MAC地址)转换为无符号字符
- 如何将无符号参数传递给模板