3

Boostプロパティツリーは、構成ファイルの解析に使用する優れたライブラリのようです。ただし、キーごとに複数の値がある状況を処理する方法がわかりません。たとえば、次のようなボックスを指定したとします。

box
{
    x -1 1
    y -1 1
    z -1 1
}

ここxで、、、yおよびはそれぞれ、、、および軸z上のボックスの境界であり、property_treeのINFO形式を使用して指定されます。スペースを使用する値に引用符を使用することについてのマニュアルに記載されていますが、それらの値を数値としてインポートできるかどうかはわかりません。文字列を数値に解析する必要があります。これは、そもそもproperty_treeを使用する目的を損なうようです。私は確かに各番号にキーを与えることができます:xyz

box 
{
    xlo -1
    xhi 1
    ylo -1
    yhi 1
    zlo -1
    zhi 1
}    

しかし、それは面倒なようで、私の設定ファイルを膨らませます。また、program_optionsでこの状況を処理できることにも注意しましたが、ネストされた構成ファイルの機能が失われました(ええ、ドット表記を使用して「ネスト」できることはわかっていますが、同じではありません)。

このような数値のリストとしてたとえばxをインポートする方法はありますか?

4

1 に答える 1

5

標準のproperty_treeは、次のように定義されているため、キーごとに1つの文字列値のみを処理します。

typedef basic_ptree<std::string, std::string> ptree;

したがって、唯一のオプションは、文字列を使用してそれらを解析することです。最良の方法は、低い値と高い値を格納する新しいクラスを定義してから、getメソッドとsetメソッドのトランスレータークラスを作成することだと思います。例えば:

struct low_high_value
{
  low_high_value() : m_low(0), m_high(0) { }
  low_high_value(double low, double high) : m_low(low), m_high(high) { }
  double m_low;
  double m_high;
};

翻訳者は次のようになります。

struct low_high_value_translator
{
  typedef std::string    internal_type;
  typedef low_high_value external_type;
  // Get a low_high_value from a string
  boost::optional<external_type> get_value(const internal_type& str)
  {
    if (!str.empty())
    {
      low_high_value val;
      std::stringstream s(str);
      s >> val.m_high >> val.m_low;
      return boost::optional<external_type>(val);
    }
    else
      return boost::optional<external_type>(boost::none);
  }

  // Create a string from a low_high_value
  boost::optional<internal_type> put_value(const external_type& b)
  {
    std::stringstream ss;
    ss << b.m_low << " " << b.m_high;
    return boost::optional<internal_type>(ss.str());
  }
};

以前のget_valueメソッドは非常に単純です。ユーザーがファイルに書き込むことができれば、改善する必要があります。

このクラスは、以下を使用して登録する必要があります。

namespace boost { namespace property_tree 
{
  template<typename Ch, typename Traits, typename Alloc> 
  struct translator_between<std::basic_string< Ch, Traits, Alloc >, low_high_value>
  {
    typedef low_high_value_translator type;
  };
} }

前のコードを含めた後、property_treeを次のように使用できます。

  pt.get<low_high_value>("box.x")
  pt.put("box.u", low_high_value(-110, 200));
于 2012-10-27T23:44:00.480 に答える