0

私は基本的に、作成したいいくつかのデータ型の内部構造を作成したいと考えています。これらのデータ型は、私のプログラム (基本的には大規模なデータベースですが、使用するように設定する手間を避けたい) の情報の大部分を保持し、シリアル化/非シリアル化されます。

しかし、テキスト ファイル/ml ファイルのレイアウトから、これらのクラス/構造体をオンザフライで作成したいと考えています。例えば:

container Music
field string name
field largenumber filesize
end container

これは非常に基本的な例です。上記の「コンテナ」はデータ型 (クラスまたは構造体) であり、「フィールド」は変数を示します (文字列は stl 文字列であり、大きな数は符号なし整数またははい、正しい構文をチェックする C++ パーサー (コンパイラーと同様) のようなものが欲しいと思います。

私は基本的に、自分のプログラムのユーザーが独自のデータ型を作成し (フィールドを追加する/フィールドを削除する/独自の構造体を作成する)、それを自分のプログラムに永久に保持することを望んでいます。

(これを実行しながらシリアル化/非シリアル化する方法を既に考え出しました - 私がしなければならないことは、最後に作成されたクラス/構造体テキスト ファイルもシリアル化されたデータと共に保存することです。これにより、シリアル化を解除するときにデータ型を再作成できます。 )。

誰かがこれを行う方法を知っていますか、または私のデザインのより良い実装を提案しますか?

PS明らかに、この情報はコンパイル時ではなく実行時に作成する必要があります。

4

2 に答える 2

1

XML からオブジェクトへの変換の場合、実際に見ているのは SOAP の一部です。私は RapidXML を好みますが、他の XML パーサーを試してオブジェクトを作成/読み取ることができます。

テキスト ファイルでは、適切な型と定義を期待してテキスト ファイルを正しく処理し、それに応じてオブジェクトを生成する独自のパーサーを作成する必要がある場合があります。

共通のインターフェイスが存在しない限り、オブジェクトを動的に作成して値を設定することは簡単ではありません。

余談ですが、ユーザーに動的に「作成」してもらいたいとおっしゃっていたので、単純なスクリプト言語を検討してみませんか (または、DSL を自分で作成しますか?)

于 2012-11-28T18:00:46.970 に答える
1

あなたが示唆するように、私は XML パーサーを作成することでそれを行い、データ型定義はファイルに含まれます。このようにして、解析が非常に簡単になります (任意の XML 読み取りライブラリを使用します)。実行時にデータ型を作成します。必要なのは、クラスContainerと、名前、型などを格納できるクラスFieldだけです。

XML ファイルを前処理して、通常は次のようなデータ構造を生成する関数を生成します。

Field newfield1 (name, type, whatever);
Field newfield2 (name2, type2, whatever2);
...
Container newContainer;
newContainer.addField(newfield1);
newContainer.addField(newfield2);
...

もちろん、それよりもはるかに優れたコードを構成することもできますが、それは単にアイデアを提供するためのものです。最初にデータ型を XML として書き留め、XML を前処理し、「ランタイム」.cpp ファイルを生成して動的型を作成します。それをプロジェクトに含めると、必要に応じて型を使用できます。

さまざまなタイプのフィールドを作成するには (事前にはわかりません)、boost::variant を使用できます (また、XML からタイプリストも生成します)。また、フィールドごとに 1 つの typedef を生成して、後で boost:get<> を使用するときに適切な型が使用されるようにすることもできます。

于 2012-11-28T18:08:43.750 に答える