50

関連する質問が2つあります。

  1. Boost Program Optionsを使用して、一連の値を渡すことができる最も簡単な方法は何ですか?私の目的は、回避prog --opt 1 --opt 2 --opt 3してprog --opt 1 2 3代わりに持つことです。

  2. 正確に2つの数値を取るオプションを使用する最も簡単な方法は何prog --opt 137 42ですか?

(「無料の」プログラムパラメータは必要ありません。)

4

2 に答える 2

46

これは遅い答えですが、誰かに役立つことを願っています。ベクトル内のアイテムの数に別の検証を追加する必要があることを除いて、アイテム#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
}
于 2012-12-31T18:37:23.357 に答える
36

最初の部分では、これは機能するはずです

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

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

2番目の部分は、もう少し作業が必要です。この関数は、次のように、いくつかの関数の動作をオーバーライドする必要があるを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");

動作するはずです。まだテストする機会がなかったので、いくつかのバグが含まれている可能性があります。しかし、少なくとも、あなたが何を必要としているかについての考えをあなたに与えるべきです。

于 2011-11-18T05:04:56.727 に答える