共通の親クラスを使用して同じコンテナに異なる型のオブジェクトを格納した後、それらを元に戻す必要があります。ベースクラスコンテナから派生クラスを抽出するには?
[テスト/ test0.C++]:
int main()
{
element wrapper;
wrapper.name = "div";
wrapper.attributes["id"] = "wrapper";
cargo<string> text("Learn from yesterday, live for today, hope for tomorrow.");
wrapper.children.push_back(&text);
cout << "Name:\t" << wrapper.name << endl;
/* I have an explicit cast here,
* but it can't be used this way
* since children may have different types
*/
cout << "Cargo:\t" << ((cargo<string>*) wrapper.children[0])->value << endl;
return 0;
}
[ソース/ element.h]
struct element
{
std::string name;
std::map< std::string, std::string > attributes;
std::vector< node* > children;
};
[ソース/ node.h]
struct node
{ };
[ソース/ cargo.h]
template <typename Type>
struct cargo
: public node
{
Type value;
cargo(Type value)
: value(value)
{ }
};
私が代わりにそのハードの...本当のノードタイプに関連付けられるタイプのホルダーのいくつかの種類があり、遠く鋳造、抽出操作でそれを使用する必要があります私のテストで1つをコード化しました。
UPDATE:
私は何をしようとしていることは、私のXMLのような言語パーサのためのシンボルテーブルエントリとしてそれを使用する簡単なドキュメントオブジェクトモデルのデータ構造です。私は既存のXMLライブラリを非常に大規模なものとして使用したくありません。私はDOMの考え方は単純だと思います。例えば、DOMツリー内のノードの汎用型をcargo<Type>
を使って許可するなど、より複雑な操作に簡単に取り入れることができます。私が採用したデザインが最も適切ではないかもしれないことを認識しています!だから私は提案に開放されています!
助けてくれてありがとう!
は、<> ''貨物に対する操作の多くを実行することを期待していますか? – Nim
おそらく、ノードには仮想Dctorがあるはずです。 – Marcin
@ニム:貨物の唯一の必要性は値を格納することです。余分な操作は追加されません。貨物にテンプレートパラメータとして渡される 'Type'はすべてのビジネスを含みます。 – Rizo