После хранения объектов разных типов в одном контейнере с использованием общего родительского класса мне нужно извлечь их обратно.
[Tests / 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;
}
[Source / element.h]
struct element
{
std::string name;
std::map< std::string, std::string > attributes;
std::vector< node* > children;
};
[Source / node.h]
struct node
{ };
[Source / cargo.h]
template <typename Type>
struct cargo
: public node
{
Type value;
cargo(Type value)
: value(value)
{ }
};
Мне нужно немноготип держателя типа, который можно связать с реальным типом узла и использовать его в дальнейших операциях приведения-извлечения ... Вместо этого жестко закодированного в моем тесте.
ОБНОВЛЕНИЕ:
Я пытаюсь создать простую структуру данных объектной модели документа, чтобы использовать ее в качестве записи таблицы символов для моего синтаксического анализатора языка, похожего на xml.Я не хочу использовать какую-либо существующую библиотеку XML, поскольку они очень большие.Я думаю, что идея DOM проста, поэтому я могу легко принять ее для некоторых более сложных операций, например, разрешив универсальные типы для узлов в дереве DOM, используя cargo<Type>
.Я признаю, что дизайн, который я принял, может быть не самым адекватным!Так что я открыт для предложений!
Буду благодарен за любую помощь!