【发布时间】:2010-12-02 18:13:08
【问题描述】:
使用公共父类将不同类型的对象存储在同一容器中后,我需要将它们提取回来。
[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;
}
[来源/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)
{ }
};
我需要某种类型的持有者来与真实的节点类型相关联,并在更远的转换提取操作中使用它......而不是在我的测试中使用硬编码。
更新:
我正在尝试做的是一个简单的文档对象模型数据结构,以将其用作我的类 xml 语言解析器的符号表条目。我不想使用任何现有的 XML 库,因为它们非常大。我认为 DOM 的想法很简单,因此我可以轻松地将它用于一些更复杂的操作,例如,通过使用 cargo<Type> 允许 DOM 树中的节点的泛型类型。我承认我采用的设计可能不是最合适的!所以我愿意接受建议!
如果有任何帮助,我将不胜感激!
【问题讨论】:
-
您是否希望在
cargo<>上进行大量操作? -
你可能知道节点应该有一个虚拟的dctor。
-
@Nim: cargo 唯一需要的是存储值。不会增加额外的操作。
Type作为模板参数传递给 cargo 将包含所有业务。 -
如果您能描述一下您要解决的问题,将会有很大帮助。解决方案可能要容易得多:)
-
这是我的建议:将问题分成三个部分。一个简单的文档结构、(反)序列化和包含从文档反序列化/序列化的数据的类。请查看 Boost.Serialization 库以获取一些想法。
标签: c++ templates class casting