Boost程序选项中的矢量参数

Sza*_*lcs 45 c++ boost boost-program-options

我有两个相关的问题:

  1. 使用Boost程序选项允许传递一系列值的最简单方法是什么?我的目标是避免prog --opt 1 --opt 2 --opt 3prog --opt 1 2 3反而.

  2. 什么是有需要的选项最简单的方法正好两个数字,如prog --opt 137 42

(我不需要任何"免费"程序参数.)

Bee*_*Bee 41

这是一个迟到的答案,但我希望它可以帮助某人.您可以在第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
}
Run Code Online (Sandbox Code Playgroud)

  • 如果根据C++ 11标准进行编码,您可以再次删除该空间,它在那里得到官方支持(在那里的任何主要编译器中,例如gcc> = 4.6).VC已将其作为特殊扩展包含了多年. (4认同)

rco*_*yer 33

对于第一部分,这应该工作

namespace po = boost::program_options;
po::option_descriptions desc("");

desc.add_options()
 ("opt", po::value<std::vector<int> >()->multitoken(), "description");
Run Code Online (Sandbox Code Playgroud)

第二部分,需要更多的工作.该函数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;
   }
}
Run Code Online (Sandbox Code Playgroud)

需要伴随的

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; }
Run Code Online (Sandbox Code Playgroud)

然后

desc.add_options()
 ("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");
Run Code Online (Sandbox Code Playgroud)

应该管用.我还没有机会测试它,所以它可能包含一些错误.但是,至少应该让你知道你需要什么.