C++ Boost程序选项中的向量参数
我有两个相关的问题:C++ Boost程序选项中的向量参数,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我有两个相关的问题: 使用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
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");
这需要伴随着
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; }
模板
固定\u令牌\u类型\u值
固定\u令牌\u值(无符号最小值、无符号最大值){
返回固定的_标记_类型的_值(0,最小,最大);}
模板
固定\u令牌\u类型\u值
固定令牌值(T*T、无符号最小值、无符号最大值){
固定\u令牌\u类型\u值*r=new
固定令牌类型值(T,min,max);
返回r;}
然后
desc.添加选项()
(“opt”,po::固定代币价值(2,2),“说明”);
应该有用。我还没有机会测试它,所以它可能包含一些bug。但是,至少应该让你知道你需要什么。这是一个迟来的答案,但我希望它能帮助别人。您可以轻松地在第#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
}
namespace po=boost::program\u选项;
po::选项描述描述(“”);
说明添加选项()
(“opt”,po::value()->multitoken(),“description”);
变量映射虚拟机;
po::store(po::parse_命令行(argc、argv、desc)、vm);
po::通知(vm);
矢量选择;
如果(!vm[“opt”].empty()&&(opts=vm[“opt”].as()).size()=2){
//很好
}
@Szabolcs,这段代码的一个有趣之处是,默认情况下需要使用向量。否则,您将如何存储这些值?因此,我认为应该将po::typed_value
更改为po::typed_value,charT>
。这是否也适用于std::array
或std::list
而不是vectors?@einpoklum我不明白为什么不适用。但是,我认为std::array
会有点棘手,因为我不知道用于插入容器的内容,尽管这可能是可配置的,并且它的固定大小需要一些调整。相比之下,std::list
没有这些限制,因此我怀疑您可以使用它作为替代品。如果按照C++11标准进行编码,您可以再次删除该空间,这是官方支持的(并且在任何主要的编译器中,例如gcc>=4.6)。几年来,VC一直将此作为一种特殊的扩展。
desc.add_options()
("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");
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
}