使用 boost::program_options 接受负双精度数
我需要能够让 boost::program_options
解析双精度数组 在命令行上传递的。对于正双打来说,这没有问题, 当然(在 add_options 中使用 multitoken 和 std::vector
),但是对于 消极的,我知道这些都是模棱两可的论点。
以下是我想要了解的内容的演示:
mycommand --extent -1.0 -2.0 -3.0 1.0 2.0 3.0 --some-other-argument somevalue
extent 由具有至少一个构造函数的 Bounds
类支持 它接受六个单独的 T
参数(在本例中为 - double
)。
template <typename T>
class Bounds
{
public:
typedef T value_type;
typedef typename std::vector< Range<T> >::size_type size_type;
typedef typename std::vector< Range<T> > Ranges;
Bounds( T minx, T miny, T minz,
T maxx, T maxy, T maxz)
{
// fill Ranges vector
}
private:
Ranges ranges;
};
我还必须提供什么来支持在 Bounds
类中使用 add_options ? ID 喜欢做类似的事情。可能的?
namespace po = boost::program_options;
po::options_description options("options");
options.add_options()
("extent,e", po::value< Bounds< double > >(), "Extent to clip points to")
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).
options(options).positional(p).run(), vm);
po::notify(vm);
if (vm.count("extent"))
{
Bounds<double> bounds = vm["extent"].as< Bounds<double> >();
// do other stuff
}
I need to be able to have boost::program_options
parse an array of doubles
that are passed on a command line. For positive doubles, this is no problem,
of course (use multitoken with std::vector<double>
in add_options), but for
negative ones, I know that these are ambiguous arguments.
Here is a demonstration of what I would like to take in:
mycommand --extent -1.0 -2.0 -3.0 1.0 2.0 3.0 --some-other-argument somevalue
extent is to be backed by a Bounds
class with at least one constructor
that takes in six individual T
arguments (in this case -- double
).
template <typename T>
class Bounds
{
public:
typedef T value_type;
typedef typename std::vector< Range<T> >::size_type size_type;
typedef typename std::vector< Range<T> > Ranges;
Bounds( T minx, T miny, T minz,
T maxx, T maxy, T maxz)
{
// fill Ranges vector
}
private:
Ranges ranges;
};
What else must I supply to support using add_options take in the Bounds
class? I'd
like to do something similar to this. Possible?
namespace po = boost::program_options;
po::options_description options("options");
options.add_options()
("extent,e", po::value< Bounds< double > >(), "Extent to clip points to")
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).
options(options).positional(p).run(), vm);
po::notify(vm);
if (vm.count("extent"))
{
Bounds<double> bounds = vm["extent"].as< Bounds<double> >();
// do other stuff
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
诀窍是强制
boost
将所有数字分类为位置值(不要与positional_options_description
混淆)。这样做的方法是定义一个style_parser
并将其作为extra_style_parser
提供给command_line_parser
:一旦获得它,就可以这样使用它:
您现在可以在但是
,仍然存在一个问题,没有办法限制每个参数所采用的标记数量,如果您使用位置参数,这可能会出现问题,例如,这样的方法不起作用:
为了解决这个问题,我们需要添加一种方法来强制参数需要的标记数量:
您现在可以将它们放在一起,如下所示:
The trick is to force
boost
to classify all numbers as positional values (not to be confused withpositional_options_description
. The way you do that is define astyle_parser
and give it to thecommand_line_parser
as anextra_style_parser
:Once you have it, this is how you use it:
You can now use negative numbers and short command line arguments at the same time.
However, there's still a problem, there's no way to restrict the number of tokens each argument takes, which can be problematic if you use positional arguments. For example, something like this won't work:
In order to fix this, we'll need to add a way to force the number of tokens an argument requires:
You can now put it all together like this:
此处指定的处理负数的方法可能也适合您。
The approach to handling negative numbers specified here might also work for you.
最简单的方法是将参数用引号引起来:
mycommand --extent '-1.0 -2.0 -3.0 1.0 2.0 3.0' --some-other-argument somevalue
The easy way would be to wrap your parameters in quotes:
mycommand --extent '-1.0 -2.0 -3.0 1.0 2.0 3.0' --some-other-argument somevalue