5

構造体のベクトルを生成するために解析したい画像 (四角形、点、ラベル付きの面など) 内の対象オブジェクトを表す xml データ ファイルのコレクションがあります。ファイルは手動で作成され (一部の C++ オブジェクトをシリアル化した結果だけではありません)、次の形式になります。

<root>
<image filename=whatever>
<object>
  <x>1</x>
  <y>2</y>
</object>
<object>
  <x>3</x>
  <y>4</y>
</object>
</image>
<image filename=something>
 ...
</image>
</root>

つまり、それぞれがオブジェクトの子のコレクションを含む画像のコレクションであり、それぞれがそのオブジェクトに関連するデータを提供する子を持っています。このデータの構造はファイルによって異なります。たとえば、あるファイルでは各オブジェクトに x と y だけが含まれ、別のファイルでは各オブジェクトに int の x1、y1、x2、y2、および double の z が含まれる場合があります。

このようなファイルを解析して、オブジェクトのベクトルを生成したいと考えています。ここで、オブジェクトは構造体です。この場合、フォームは struct Object { int x; です。int y; }。

オブジェクトのさまざまな選択肢について、現在、rapidxml を使用して同じ方法で xml を解析する個別の関数がありますが、抽出するフィールドは異なります。

テンプレート化された関数を作成して、何らかの方法で構造体の要素を指定するだけで、関数が適切な構造体のベクトルを返すようにしたいと考えています。つまり、ユーザーは ("x1", int)、("x2", int) などのペアのリストを指定し、残りの作業を自動的に行う必要があります。

XML スキーマを使用しなくても済むように、この問題を解決する優れた解決策がきっとあるはずです。どうすればいいですか?

4

2 に答える 2

5

Boost Property Treeを試すことができます。

独自のロード/保存関数を記述して、XML (または INI または JSON) データを独自の構造にマップできます。チュートリアルを参照してください。

すでに使用している RapidXML も使用します。

編集:

次のようなものを試すことができます

template<typename T>
struct Field
{
    typedef T type;
    std::string name;
};

template<typename... Fields>
std::tuple<typename Fields::type...>
load(const Data& data, Fields... f)
{
    return std::make_tuple( data.get<typename Fields::type>(f.name)... );
}

Dataのような入力データのソースはどこにありboost::ptree、その関数を次のように使用します。

load(d, Field<int>{"x1"}, Field<int>{"x2"} );

次に、正しい型のタプルから各データ型を構築できるようにするだけです。

于 2013-01-10T15:52:28.423 に答える