我有两个相关的问题:向量参数
什么是最简单的方式允许通过一系列的价值观,使用Boost程序选项?我的目标是避免
prog --opt 1 --opt 2 --opt 3
而不是prog --opt 1 2 3
。什么是最简单的方法来选择需要的两个数字,例如。
prog --opt 137 42
?
(我不需要任何 “免费” 程序参数。)
我有两个相关的问题:向量参数
什么是最简单的方式允许通过一系列的价值观,使用Boost程序选项?我的目标是避免prog --opt 1 --opt 2 --opt 3
而不是prog --opt 1 2 3
。
什么是最简单的方法来选择需要的两个数字,例如。 prog --opt 137 42
?
(我不需要任何 “免费” 程序参数。)
在第一部分,这应该工作
namespace po = boost::program_options;
po::option_descriptions desc("");
desc.add_options()
("opt", po::value<std::vector<int> >()->multitoken(), "description");
第二部分,需要多一点的工作。 po::value
返回po::typed_value< T, charT >
即您必须覆盖的几个功能行为的功能,如下
template< typename T, typename charT = char >
class fixed_tokens_typed_value : public po::typed_value< T, charT > {
unsigned _min, _max;
typedef po::typed_value< T, charT > base;
public:
fixed_tokens_typed_value(T * t, unsigned min, unsigned max)
: _min(min), _max(max), base(t) {
base::multitoken();
}
virtual multi_typed_value* min_tokens(unsigned min) {
_min = min;
return *this;
}
unsigned min_tokens() const {return _min;}
virtual multi_typed_value* max_tokens(unsigned max) {
_max = max;
return *this;
}
unsigned max_tokens() const {return _max;}
base* zero_tokens() {
_min = _max = 0;
base::zero_tokens();
return *this;
}
}
需要由
template< typename T >
fixed_tokens_typed_value<T>
fixed_tokens_value(unsigned min, unsigned max) {
return fixed_tokens_typed_value<T>(0, min, max); }
template< typename T >
fixed_tokens_typed_value<T>
fixed_tokens_value(T * t, unsigned min, unsigned max) {
fixed_tokens_typed_value<T>* r = new
fixed_tokens_typed_value<T>(t, min, max);
return r; }
然后
desc.add_options()
("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");
陪同应该管用。我还没有机会测试它,所以它可能包含一些错误。但是,至少应该让你知道你需要什么。
这是一个迟到的答案,但我希望它可以帮助别人。你可以很容易地使用相同的技术,项目#1,除非你需要在你的载体项目的数量增加另一个验证:
从rcollyer的例子:
namespace po = boost::program_options;
po::option_descriptions desc("");
desc.add_options()
("opt", po::value<std::vector<int> >()->multitoken(), "description");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
vector<int> opts;
if (!vm["opt"].empty() && (opts = vm["opt"].as<vector<int> >()).size() == 2) {
// good to go
}
@Szabolcs,一个有趣的观点与此代码是它默认需要使用向量。否则,你将如何存储值?所以,我认为'po :: typed_value < T, charT >'应该改为'po :: typed_value,charT>'。 –
rcollyer
这是否也适用于'std :: array's或'std :: lists's而不是向量? – einpoklum
@einpoklum我不明白为什么不。但是,我认为'std :: array'会有点棘手,因为我不知道用什么插入到容器中,尽管这可能是可配置的,并且其固定大小需要一些适应。相反,'std :: list'没有这些限制,所以我怀疑你可以用它作为替代品。 – rcollyer