禁止使用boost::p rogram_options对无符号值进行负参数

Disallow negative argument for unsigned value with boost::program_options

本文关键字:无符号 参数 boost 禁止 rogram options      更新时间:2023-10-16

假设我有一个使用 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并在负数时抛出错误会更容易。代码也更少。