15

コマンドラインからできるように、構成ファイルのマルチトークンオプションから読み取ることができないようです。設定ファイルの構文は何ですか?

オプションの説明は次のように追加されます。

//parser.cpp
- - -
po::options_description* generic;
generic=new po::options_description("Generic options");
generic->add_options()
("coordinate",po::value<std::vector<double> >()->multitoken(),"Coordinates (x,y)");

その後、コマンドと構成ファイルを解析します。

コマンドラインで「--coordinate 1 2」が機能します。ただし、設定ファイルで試してみると:

coordinate = 1,2

また

coordinate= 1 2

invalid_option_value 例外が発生して失敗します。マルチトークンオプションの場合、構成ファイルの構文は正確には何ですか?

4

3 に答える 3

11

構成ファイルで、ベクターの各要素を別の行に配置します。

coordinate=1
coordinate=2
于 2011-12-16T13:43:38.820 に答える
6

カスタムバリデータを作成することで、求める動作を実現できます。このカスタムバリデータは以下を受け入れます:

./progname --coordinate 1 2
./progname --coordinate "1 2"
#In config file:
coordinate= 1 2

コードは次のとおりです。

struct coordinate {
  double x,y;
};

void validate(boost::any& v,
  const vector<string>& values,
  coordinate*, int) {
  coordinate c;
  vector<double> dvalues;
  for(vector<string>::const_iterator it = values.begin();
    it != values.end();
    ++it) {
    stringstream ss(*it);
    copy(istream_iterator<double>(ss), istream_iterator<double>(),
      back_inserter(dvalues));
    if(!ss.eof()) {
      throw po::validation_error("Invalid coordinate specification");
    }
  }
  if(dvalues.size() != 2) {
    throw po::validation_error("Invalid coordinate specification");
  }
  c.x = dvalues[0];
  c.y = dvalues[1];
  v = c;
}
...
    po::options_description config("Configuration");
    config.add_options()
        ("coordinate",po::value<coordinate>()->multitoken(),"Coordinates (x,y)")
        ;

参考文献:

于 2011-05-04T15:14:03.673 に答える
0

同様の問題に直面している間に、Rob の回答 (2011 年 5 月 4 日以降) から上記のコードを取得しましたが、ブースト アーキテクチャと C++11 の変更により、いくつか変更する必要がありました。私が変更した (または変更したであろう) 部分のみを引用します。検証関数内にない残りは同じままです。適合上の理由から、必要な std:: プレフィックスを追加しました。

namespace po = boost::program_options;

void validate(boost::any& v,
  const std::vector<std::string>& values,
  coordinate*, int) {
  coordinate c;
  std::vector<double> dvalues;
  for(const auto& val : values)  {
    std::stringstream ss(val);
    std::copy(std::istream_iterator<double>(ss), std::istream_iterator<double>(),
      std::back_inserter(dvalues));
    if(!ss.eof()) {
      throw po::invalid_option_value("Invalid coordinate specification");
    }
  }
  if(dvalues.size() != 2) {
    throw po::invalid_option_value("Invalid coordinate specification");
  }
  c.x = dvalues[0];
  c.y = dvalues[1];
  v = c;
}

po::validation_error から po::invalid_option_value へのシフトはhttps://stackoverflow.com/a/12186109/4579106で示唆されました

于 2016-09-01T13:59:58.780 に答える